我有一个 C++ DLL,代码如下:
LogMessage( "Hello world" );
try {
throw new int;
} catch( int* e ) {
LogMessage( "Caught exception" );
delete e;
}
LogMessage( "Done" );
此 DLL 由某些第三方应用程序加载并调用上面的代码。问题是只有第一个 LogMessage
被调用 - 即使有一个异常处理程序,控制流也被转移到未知。
我看到了这一点,但无法确定这是需要调查的一些隐蔽错误还是消费者应用程序的邪恶力量。
消费者应用程序真的可以覆盖 DLL 中的 C++ 异常处理吗?
编辑:在考虑了答案中概述的所有要检查的事情后,问题得到了解决。在实际代码中,不仅仅是throw,还有一个用于抛出异常的特殊函数,它在调试版本中调用了 MessageBoxW() Win32 调用。并且消费者应用程序在显示消息框(它是一项 NT 服务)时遇到了麻烦,并且实际上挂断了。所以这不是以任何方式处理 C++ 异常的问题。
最佳答案
代码对我来说看起来没问题,但我很想再放入几个 catch 子句,看看它是否命中其他子句。也就是说,我会输入:
<pre> catch (const std::exception &ex) {
... log exception ...
}
catch (...) {
... log exception ..
}
</pre>
我希望它会命中指针捕获(即使这真的不是一个好主意,请参阅 Igor Oks 提供的链接)或 std::exception,以防它无法分配内存。也就是说,它应该命中三个 catch 子句之一,这样异常就无法逃脱 DLL。
我还将抛出的对象更改为值类型(即使它是 int)并相应地更新 catch 子句以查看您是否通过这种方式改变了行为。
关于c++ - 库使用者是否可以覆盖 C++ 异常处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/914351/