C++ DLL 中的异常处理

C++ Exception handling in DLL

本文关键字:异常处理 DLL C++      更新时间:2023-10-16

我知道,在Stackoverflow有很多类似的问题。但是没有一个答案可以解决我的问题。

我正在创建以这种方式导出某些函数的 DLL:

extern "C" __declspec(dllexport) int init() { ... }

我在Windows XP上使用MinGW 4.4。init()也有例外,因为我使用Apache Thrift,并且有像ttransport->open()这样的代码,其中ttransportboost::shared_ptr<TTransport>TTransport - Apache Thrift的类。在某些情况下,ttransport->open()抛出异常(TTransportExceptionstd::exception继承TTransportException)。

该异常使加载我的 DLL 的主机程序崩溃。主机程序是由第三人编写的,我没有主机程序的代码。

因此,我在徘徊,为什么像这样的包装方法无济于事(主机程序以同样的方式崩溃):

try
{
    ttransport->open();        
}
// or just catch(...)
catch (std::exception &e) // or, using TTransportException
{
    return 42;
}

有人能说我做错了什么吗?

例外不是我的 - 所有这些都是在Apache Thrifts库中编写的,所以我别无选择。

只能通过 SEH 支持 - 大多数 C/C++ 编译器为此提供 __try/__except/__finally...MINGW不是其中之一...

有一些努力可以通过宏和/或库添加对 SEH 的支持。这些都不是真正的生产质量,更像是"阿尔法代码"......所以我不会在没有生产中进行彻底测试(很可能是一些修改)的情况下使用它们......

另一点是,即使您将其用于 MINGW,它仍然可能导致堆栈展开问题,因为为此您需要编译器支持,而 MINGW 为 SEH 提供的不是 - 一些细节见这里。