我知道,Stackoverflow有很多类似的问题。但是没有答案能解决我的问题。
我正在创建以这种方式导出某些功能的DLL:
extern "C" __declspec(dllexport) int init() { ... }
我在Windows XP上使用MinGW 4.4。
init()
中有一些例外,因为我使用的是Apache Thrift,并且有类似ttransport->open()
的代码,其中ttransport
是boost::shared_ptr<TTransport>
,而TTransport
是Apache Thrift的类。当ttransport->open()
引发TTransportException
异常(TTransportException
继承自std::exception
)时,可能会出现某些情况。该异常使加载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和/或macros添加对library的支持。这些并不是真正的生产质量,更像是“ alpha代码” ...所以我会避免在生产中未经全面测试(很可能进行一些修改)的情况下使用它们...
另一点是,即使您在MINGW上使用它也可能会导致堆栈展开问题,因为为此您需要MINGW for SEH不提供的编译器支持-有关详细信息,请参见here。
关于c++ - DLL中的C++异常处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13895564/