c++ - 库使用者是否可以覆盖 C++ 异常处理?

标签 c++ windows exception service messagebox

我有一个 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/

相关文章:

java - 当尝试删除同一事务中的锁定实体时,EntityManager 抛出 OptimisticLockException

c - 如何创建包含 32 位和 64 位二进制文​​件的应用程序,并在操作系统上运行相应的应用程序?

linux - "svnrdump"和 "svnadmin dump"产生不同大小的转储的原因可能是什么?

java - 无法在 Windows 上运行我的 jar 文件

python - 如何判断 python 的 ZipFile.writestr() 是否因为文件已满而失败?

c++ - 连续内存

c++ - CMake 标志卡住

c++ - 在这种情况下,在 'this' 前面加一个星号有什么作用?

c++ - 从一种颜色插值到另一种颜色并返回

.net - 使用 AesManaged 解密之前验证 key /IV ?或者在 CryptographicException 发生之前避免它?