【问题标题】:C++ Exception handling in DLLDLL 中的 C++ 异常处理
【发布时间】:2012-12-03 10:49:44
【问题描述】:

我知道,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() 抛出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


【解决方案1】:

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

有一些努力通过macros 和/或library 添加对SEH 的支持。这些并不是真正的生产质量,它更像是“alpha 代码”......所以我会避免在生产中未经彻底测试(并且很可能进行一些修改)的情况下使用它们......

另一点是,即使你让它在 MINGW 上工作,它仍然可能导致堆栈展开问题,因为为此你需要 MINGW 不为 SEH 提供的编译器支持 - 一些详细信息请参阅 here

【讨论】:

  • 前段时间我也在programmingunlimited.net找到了资源,甚至使用了宏支持SEH,但仍然主机程序崩溃。有没有可能,在我的情况下使用库可以给出一些结果?
  • @troyane 包含该库的代码是“alpha 代码”......您需要深入挖掘并修改+测试它,然后才能以任何可靠的方式使用它!唯一的其他选择是构建进程外服务器并使用 IPC。
  • 是的,想想,我得到了答案。但是,优化参数以及其他编译参数是否可以影响这种异常处理机制?
  • @troyane 是的......这些会影响处理机制。
猜你喜欢
  • 2020-04-07
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
相关资源
最近更新 更多