通常访问冲突会终止程序,我无法使用try
and捕获 Win32 异常catch
。有没有办法让我的程序运行,即使在访问冲突的情况下?最好我想处理异常并向用户显示发生了访问冲突。
编辑:我希望我的程序非常健壮,即使是针对编程错误。我真正想避免的事情是程序终止,即使以某些损坏状态为代价。
通常访问冲突会终止程序,我无法使用try
and捕获 Win32 异常catch
。有没有办法让我的程序运行,即使在访问冲突的情况下?最好我想处理异常并向用户显示发生了访问冲突。
编辑:我希望我的程序非常健壮,即使是针对编程错误。我真正想避免的事情是程序终止,即使以某些损坏状态为代价。
在 Windows 中,这称为结构化异常处理 (SEH)。有关详细信息,请参见此处:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657%28v=vs.85%29.aspx
实际上,您可以注册以在发生异常时获取回调。出于显而易见的原因,您不能对每个异常都这样做。
使用 SEH,您可以检测到很多异常,包括访问违规,但不是全部(例如双堆栈错误)。即使有可检测到的异常,也无法保证异常发生后的 100% 稳定性。但是,通知用户、记录错误、将消息发送回服务器并正常退出可能就足够了。
我首先要说你的问题包含一个矛盾:
编辑:我希望我的程序非常健壮,......我真正想要避免的是程序终止,即使以某些损坏状态为代价。
在损坏状态的情况下继续跛行的程序并不强大,它是一种责任。
第二,各种意见。关于:
编辑:我希望我的程序非常健壮,即使是针对编程错误。...
当编程错误是指所有错误时,这是不可能的。
如果通过编程错误您的意思是:“程序员滥用了某些 API,我想要错误消息而不是崩溃,那么编写所有代码并内置双重检查:例如,始终在使用前检查所有指针是否为 NULL,即使“它们不能如果程序员没有犯错,则为 NULL”等。(哦,您也可以考虑不使用 C++ ;-)
但是恕我直言,在任何 C++ 应用程序中都必须接受一定数量的程序崩溃,无论是什么错误。(除非它是微不足道的,或者你测试它用于军事或医疗用途(即使那样......)。)
其他人已经提到了SEH——这是一个“简单”的问题__try / __catch
。
也许您可以尝试与Windows 错误报告 (WER)成为朋友,而不是尝试捕获程序内部的错误——我从未拉过这个,但据我了解,您可以通过OutOfProcessException...
回调函数完全自定义它。