3

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

我注意到有可能捕获这些异常之一。例如,在 Microsoft Visual C++ 中,您可以使用/EHa__try/__catch这样做。

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

4

5 回答 5

8

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

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

于 2012-06-19T20:58:58.667 回答
6

一个原因可能是编写故障转储文件;您将对其有更多的控制权,并能够编写您想要的确切类型。例如,在 Windows 中,您可以调用MiniDumpWriteDump来执行此操作。

于 2012-06-19T20:58:40.607 回答
3

在所有访问违规后,您的应用程序不能保证稳定。但它可以稳定或在一段时间后恢复,因此捕获访问冲突让您有机会:

  1. 通知用户出现问题
  2. 让用户尝试保存工作
  3. 尝试恢复
  4. 记录诊断信息
  5. 以你想要的方式退出,而不是消失。

一个典型的例子是从插件中捕获异常的主机应用程序。这样主机应用程序(例如 Photoshop)可以告诉用户“插件 X 崩溃,Photoshop 不稳定……您应该保存您的工作,然后重新启动 Photoshop。”

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

于 2012-06-19T21:25:37.183 回答
1

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

于 2012-06-19T20:59:09.497 回答
1

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

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

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

于 2012-06-19T21:24:53.003 回答