与C ++异常不同,访问冲突表明应用程序运行时已泄露,因此应用程序的状态未定义。在这种情况下最好的办法是退出你的应用程序(通常是因为它崩溃而为你完成)。
我注意到可以捕获其中一个异常。例如,在Microsoft Visual C ++中,您可以使用/EHa
或__try/__catch
来执行此操作。
那么,你想要抓住它们的原因是什么?据我了解,你的应用程序无法恢复。
答案 0 :(得分:7)
您可以从访问冲突中恢复。
例如,您可以通过使用VirtualAlloc
分配一些地址空间来创建动态数组,但将其指向的内存标记为不存在。然后,当您尝试使用某些内存时,您会捕获访问冲突,映射访问发生的内存页面,然后重新尝试导致违规的指令。
答案 1 :(得分:6)
一个原因可能是编写崩溃转储文件;你可以更好地控制它,并能够写出你想要的确切类型。例如,在Windows中,您可以调用MiniDumpWriteDump来执行此操作。
答案 2 :(得分:3)
在所有违规行为发生后,您的应用无法保证稳定。但它可以稳定或在一些后恢复,因此捕获访问冲突让您有机会:
一个典型的例子是从插件中捕获异常的宿主应用程序。这样主机应用程序(例如Photoshop)可以告诉用户“插件X崩溃,Photoshop不稳定......你应该保存你的工作,然后重新启动Photoshop。”
请注意,这与C ++异常处理不同,C ++异常处理根本不表示不可恢复的错误,而是更多的堆栈展开功能。
答案 3 :(得分:1)
我认为优雅地崩溃并让用户知道发生了什么会更好,而不仅仅是让应用程序消失。
答案 4 :(得分:1)
如果您的应用程序遭到访问冲突,您可能会或可能无法恢复。如果你的应用程序处于未定义状态,例如你破坏你的堆栈,你就完成了。
从失控指针读取可能不会损坏您的应用程序,并且您可能会恢复它。
无论哪种方式,它正在发生的事实表明你的代码中存在错误,所以不应该尝试恢复,而应该捕获错误并转储你可以帮助你调试问题的状态。