C++ DLL 中的异常处理
C++ Exception handling in DLL
我知道,在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
从std::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 提供的不是 - 一些细节见这里。
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用 stoi 功能进行异常处理
- 子系统中的异常处理:本机
- 与异常处理程序中的操作员<<不匹配
- 为什么g_object_set抛出异常(vcruntime140.dll)?
- 数组 C++ 上的异常处理程序
- 异常处理:如果用户输入不是三个特定字符之一
- C++ 异常处理错误输出
- 在0x5914F3BE抛出异常(基于.dll)
- 视觉 std::矢量无异常:警告 C4530:使用了C++异常处理程序,但未启用展开语义.指定 /EHsc
- C++交换机状态异常处理
- 在字符串类上的成员函数和out_of_range异常处理
- 奇怪的消息 (_Base_bitset::_M_do_to_ulong) 从溢出异常处理程序中打印出来
- C++Windows DLL:不同函数中的异常处理
- C++ DLL 中的异常处理
- 手动加载的DLL中的异常处理
- System类型的未处理异常.my.dll中出现StackOverflow异常
- 0x50E2DF58时未处理的异常 (msvcp120d.dll)