c++ - 在 Visual C++ 程序中每次抛出异常时,如何运行一些代码?

标签 c++ visual-c++ exception exception-handling

如果在 C++ 程序中抛出异常,控制将转移到异常处理程序或调用 terminate()

即使程序从处理程序内部(或从 terminate() 处理程序)发出一些可能为时已晚的诊断 - 大多数值在调用堆栈中的异常点抛出,不在处理程序中。

在 Windows 上,可以使用 [StackWalk64()] 获取调用堆栈 1功能。关键是如何在正确的时刻调用该函数。

有没有办法让 Visual C++ 程序在每次抛出异常(或未设置处理程序的异常)时执行一些用户代码?

最佳答案

如果您想在抛出 SEH 异常时执行操作,例如发生访问冲突时,那么您可以简单地捕获 SEH 异常(使用 __finally 或转换为 C++ 异常(参见 here ) ) 并访问异常中的上下文,这是抛出异常时的上下文。然后,您可以使用 StackWalker 或小型转储生成调用堆栈。恕我直言,最好生成一个小型转储。

如果您想在 C++ 异常被抛出时捕获它们,并且您无权访问 C++ 异常类的源代码,那么您需要更巧妙一些。我通过在自定义调试器下运行目标进程来处理这个问题——使用调试 API(请参阅 here ),它会在抛出异常时收到通知。此时您可以创建目标进程的小型转储或调用堆栈。

关于c++ - 在 Visual C++ 程序中每次抛出异常时,如何运行一些代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4223390/

相关文章:

c++ - 如何初始化 C 字符串数组(无 STL)

c++ - C/C++ 稀有关键字 - register、volatile、extern、explicit

c++ - C++模板:无法识别的模板声明/定义

c# - 获取抛出异常的方法名

c++ - 如何一次且仅创建一次对象?

c++ - 如何在 C++ 中清除 cin 缓冲区

c++ - 没有 GetFilePointer(Ex) Windows API 函数吗?

java - 仅当抛出 6 IllegalArgumentException 时,我才需要 JUnit 传递

java - 使用 Apache ExceptionUtils.getRootCause 处理异常的正确方法是吗?

c++ - 引用类型示例问题