如何在Visual Studio C ++中处理访问冲突?

时间:2013-01-30 18:14:39

标签: visual-c++ exception-handling access-violation structured-exception

通常,访问冲突会终止程序,我无法使用trycatch捕获Win32异常。有没有办法让我的程序保持运行,即使是在访问冲突的情况下?最好我想处理异常并向用户显示发生的访问冲突。

编辑:我希望我的程序非常强大,甚至可以防止编程错误。我真正想要避免的是程序终止,即使以一些损坏的状态为代价。

2 个答案:

答案 0 :(得分:4)

在Windows中,这称为结构化异常处理(SEH)。有关详细信息,请参见此处:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657%28v=vs.85%29.aspx

实际上,您可以注册以在发生异常时获得回调。出于显而易见的原因,你不能对每个例外都这样做。

使用SEH,您可以检测到许多异常,包括访问冲突,但不是全部(例如双堆栈错误)。即使有可检测的异常,也无法确保异常后的100%稳定性。但是,通知用户,记录错误,将消息发送回服务器并正常退出可能就足够了。

答案 1 :(得分:3)

首先,我要说你的问题包含一个矛盾:

  

编辑:我希望我的程序非常强大,...我真正想要避免的是程序终止,即使以某些损坏的状态为代价。

在状态损坏的情况下保持limpin的程序不健全,这是一种责任。


第二,各种意见。关于:

  

编辑:我希望我的程序非常强大,甚至可以防止编程错误。 ...

编程错误表示所有错误时,这是​​不可能的。

如果通过编程错误,你的意思是:“程序员滥用了一些API,我想要错误消息而不是崩溃,然后用内置的双重检查编写所有代码:例如,总是检查所有指针使用前为NULL,即使“如果程序员没有出错也不能为NULL”等等(哦,你也可以考虑使用C ++; - )

但恕我直言,一些程序崩溃 - 无关紧要 - 在任何C ++应用程序中都必须接受哪些错误。 (除非它是微不足道的,或者你为了军事或医疗用途而测试它的地狱(即使那时......)。)


其他人已经提到SEH - 这是__try / __catch的“简单”问题。

也许不是试图捕捉程序中的错误,你可以尝试成为Windows Error Reporting (WER)的朋友 - 我从来没有拉过这个,但据我所知,你可以通过{{1完全自定义它}} callback functions