【发布时间】:2012-12-03 10:49:44
【问题描述】:
我知道,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 库中编写的,所以我别无选择。
【问题讨论】:
-
不要从 C 语言函数中抛出异常,这不是预期的
-
这是一个Java异常,你当然不能用std::exception捕获它。您需要使用 SEH 异常处理来捕获它。可以肯定的是,当您使用 MinGW 时,您无法完成这项工作。背景资料在这里:stackoverflow.com/a/7049836/17034
标签: c++ exception dll mingw thrift