关于c#:如何捕获.NET应用程序中的所有异常/崩溃

关于c#:如何捕获.NET应用程序中的所有异常/崩溃

How to catch ALL exceptions/crashes in a .NET app

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
.NET - What’s the best way to implement a"catch all exceptions handler"

我有一个崩溃的.NET控制台应用程序应用程序并向用户显示一条消息。
我的所有代码都在try{} catch(Exception e){}块中,但偶尔会显示错误。

在Win32应用程序中,您可以通过安装各种异常处理程序捕获所有可能的异常/崩溃:

1
2
3
4
5
6
7
/* C++ exc handlers */
_set_se_translator
SetUnhandledExceptionFilter
_set_purecall_handler
set_terminate
set_unexpected
_set_invalid_parameter_handler

什么是.NET世界中的等价物,所以我可以处理/记录/安静所有可能的错误情况?


您可以向AppDomain.UnhandledException事件添加事件处理程序,并在抛出异常并且未捕获异常时调用它。


与其他人发布的内容相反,捕获所有异常并没有错。重要的是要妥善处理它们。如果您有堆栈溢出或内存不足的情况,应该关闭应用程序。此外,请记住,OOM条件可以防止您的异常处理程序正常运行。例如,如果异常处理程序显示带有异常消息的对话框,则如果内存不足,则可能没有足够的空间用于对话框显示。最好记录并立即关闭。

正如其他人所提到的,您可以处理可能会错过的集合异常的UnhandledException和ThreadException事件。然后简单地在主循环周围抛出一个异常处理程序(假设一个winforms应用程序)。

此外,您应该知道,对于内存不足的情况,并不总是抛出OutOfMemoryExceptions。 OOM条件可以触发代码或框架中的各种异常,这些异常不一定与真实基础条件内存不足有关。当底层原因实际上没有内存时,我经常看到InvalidOperationException或ArgumentException。


我们的主持人Jeff Atwood在codeproject中的这篇文章就是您所需要的。
包括用于捕获未处理异常的代码和用于向用户显示有关崩溃的信息的最佳实践。


Global.asax类是你的最后一道防线。
看着:

1
protected void Application_Error(Object sender, EventArgs e)

方法


请注意,某些异常是危险的 - 或者大多数是无法捕获的,

  • OutOfMemoryException:您在catch处理程序中执行的任何操作都可能分配内存(在CLR的托管或非托管端),从而触发另一个OOM
  • StackOverflowException:根据CLR是否足够早地检测到它,您可能会收到通知。最糟糕的情况是,它只是杀死了这个过程。

虽然在没有正确处理它们的计划的情况下捕获所有异常肯定是一种不好的做法,但我认为应用程序应该以一种优雅的方式失败。崩溃不应该吓死用户,至少它应该显示错误的描述,一些信息要报告给技术支持人员,理想情况下是关闭应用程序并重新启动它的按钮。在理想的世界中,应用程序应该能够在磁盘上转储用户数据,然后尝试恢复它(但我发现这要求太多)。

无论如何,我通常使用:

1
AppDomain.CurrentDomain.UnhandledException


您可以使用AppDomain.CurrentDomain.UnhandledException来获取事件。


您也可以使用Application.ThreadException事件。

一旦我开发在基于COM的应用程序内运行的.NET应用程序;这个事件非常有用,因为AppDomain.CurrentDomain.UnhandledException在这种情况下不起作用。


请注意,捕获这些未处理的异常可能会更改应用程序的安全性要求。您的应用程序可能会在某些上下文(从网络共享等运行时)停止正常运行。一定要彻底测试。


我认为您甚至不应该捕获所有异常,但最好让它们向用户显示。原因是你应该只捕获你可以实际处理的异常。如果遇到一些导致程序停止但仍然捕获它的异常,这可能会导致更严重的问题。
另请阅读FAQ:为什么FxCop会警告catch(异常)?


使用两者都没有坏处
AppDomain.CurrentDomain.UnhandledException
Application.ThreadException

但请记住,这些处理程序不会捕获辅助线程上的异常;如果需要,使用SafeThread作为辅助线程


推荐阅读

    网页抓取电脑信息|电脑网页捕获

    网页抓取电脑信息|电脑网页捕获,,1. 电脑网页捕获可以使用抓包软件,推荐使用SmartSniff,关闭其它网络程序,点击SmartSniff启动捕获,再打开软件

    苹果电脑win8崩溃了|mac系统崩溃了

    苹果电脑win8崩溃了|mac系统崩溃了,,mac系统崩溃了解决方案1.首先下载苹果官方原装系统笔记本全盘数据清空格式化掉2.下载微软官方版 Wind

    未知软件异常应用程序错误解决方案

    未知软件异常应用程序错误解决方案,,我有很多朋友的电脑未知软件异常应用程序错误的问题,对于异常未知的软件异常中的应用一般提示(0xc00000

    小米手机安装的应用程序包在哪里

    小米手机安装的应用程序包在哪里,,问题: 下载小米手机系统的安装文件在哪里 答案uff1a 下载应用程序包位置:SD卡>下载。 (摘自:小米手册:米

    windows11系统崩溃无法启动怎么办?

    windows11系统崩溃无法启动怎么办?,无法启动,系统,  windows11系统崩溃无法启动怎么办?win11系统虽然已经上线,但是还在不断的完善修复中,很

    应用程序对象

    应用程序对象,,应用程序对象是一个应用程序级对象,用于在所有用户之间共享信息,并且在Web应用程序运行期间可以保存数据。 应用的性质: 方法

    7市场上:2TB硬盘崩溃核心CPU核狂降4

    7市场上:2TB硬盘崩溃核心CPU核狂降4,,今天北京中关村英特尔处理器现货市场,核心旗舰四核i7-975盒下跌100元,价格是6300元,另外,入门级的32nm i3