为什么要捕获访问冲突?

时间:2012-06-19 20:56:22

标签: c++ error-handling access-violation

与C ++异常不同,访问冲突表明应用程序运行时已泄露,因此应用程序的状态未定义。在这种情况下最好的办法是退出你的应用程序(通常是因为它崩溃而为你完成)。

我注意到可以捕获其中一个异常。例如,在Microsoft Visual C ++中,您可以使用/EHa__try/__catch来执行此操作。

那么,你想要抓住它们的原因是什么?据我了解,你的应用程序无法恢复。

5 个答案:

答案 0 :(得分:7)

您可以从访问冲突中恢复。

例如,您可以通过使用VirtualAlloc分配一些地址空间来创建动态数组,但将其指向的内存标记为不存在。然后,当您尝试使用某些内存时,您会捕获访问冲突,映射访问发生的内存页面,然后重新尝试导致违规的指令。

答案 1 :(得分:6)

一个原因可能是编写崩溃转储文件;你可以更好地控制它,并能够写出你想要的确切类型。例如,在Windows中,您可以调用MiniDumpWriteDump来执行此操作。

答案 2 :(得分:3)

在所有违规行为发生后,您的应用无法保证稳定。但它可以稳定或在一些后恢复,因此捕获访问冲突让您有机会:

  1. 告知用户一些不好的事情
  2. 让用户尝试保存工作
  3. 尝试恢复
  4. 记录诊断信息
  5. 以您想要的方式退出,而不是消失。
  6. 一个典型的例子是从插件中捕获异常的宿主应用程序。这样主机应用程序(例如Photoshop)可以告诉用户“插件X崩溃,Photoshop不稳定......你应该保存你的工作,然后重新启动Photoshop。”

    请注意,这与C ++异常处理不同,C ++异常处理根本不表示不可恢复的错误,而是更多的堆栈展开功能。

答案 3 :(得分:1)

我认为优雅地崩溃并让用户知道发生了什么会更好,而不仅仅是让应用程序消失。

答案 4 :(得分:1)

如果您的应用程序遭到访问冲突,您可能会或可能无法恢复。如果你的应用程序处于未定义状态,例如你破坏你的堆栈,你就完成了。

从失控指针读取可能不会损坏您的应用程序,并且您可能会恢复它。

无论哪种方式,它正在发生的事实表明你的代码中存在错误,所以不应该尝试恢复,而应该捕获错误并转储你可以帮助你调试问题的状态。