Application.ThreadException和AppDomain.CurrentDomain.UnhandledException之间有什么区别?
好的,这很简单:
-
Application.ThreadException
和。之间的区别是什么?
AppDomain.CurrentDomain.UnhandledException
? -
我需要处理两个吗?
谢谢!
Application.ThreadException特定于Windows窗体。 Winforms运行事件处理程序来响应Windows发送给它的消息。 例如,点击事件,我相信你知道他们。 如果这样的事件处理程序引发exception,那么在Winforms消息循环内部会出现一个反向停止,以捕获该exception。
该backstop触发Application.ThreadException事件。 如果你不覆盖它,用户将得到一个ThreadExceptionDialog 。 这使得他可以忽略exception并继续运行程序。 不是一个好主意btw。
您可以通过在Program.cs的Main()方法中调用Application.SetUnhandledExceptionMode()来禁用此行为。 如果没有这个backstop,通常的事情发生在一个线程从未处理的exception死亡时: AppDomain.UnhandledExceptionexception激发,程序终止。
Fwiw:“ThreadException”是一个非常糟糕的名字select。 它与线程无关。
在使用Windows窗体的应用程序中,主应用程序线程中的未处理的exception会导致引发Application.ThreadException
事件。 如果处理此事件,则默认行为是未处理的exception不会终止应用程序,尽pipe应用程序处于未知状态。 在这种情况下,不会引发UnhandledException
事件。 可以通过使用应用程序configuration文件或通过使用Application.SetUnhandledExceptionMode
方法在将ThreadException
事件处理程序挂接之前将模式更改为UnhandledExceptionMode.ThrowException
来更改此行为。 这仅适用于主应用程序线程。 引发的UnhandledException
事件是在其他线程中抛出的未处理的exception。
从Visual Studio 2005开始 , Visual Basic应用程序框架为主应用程序线程中的未处理exception提供了另一个事件WindowsFormsApplicationBase.UnhandledException
。 此事件具有与AppDomain.UnhandledException使用的事件参数对象具有相同名称的事件参数对象,但具有不同的属性。 特别是,这个事件参数对象具有ExitApplication
属性,允许应用程序继续运行,忽略未处理的exception(并使应用程序处于未知状态)。 在这种情况下,不会引发AppDomain.UnhandledException事件。
Application.ThreadException
可以被捕获,并且应用程序可以继续 (一般来说不是一个好主意,但是对于像定期运行某些操作这样的应用程序,这是一个很好的解决scheme)。
要捕获未由Windows窗体创build和拥有的线程中发生的exception,请使用AppDomain.UnhandledException
。 它允许应用程序在系统默认处理程序向用户报告exception并终止应用程序之前logging有关该exception的信息。
处理这个exception不会阻止应用程序被终止。
可以完成的最大数量(程序数据在未处理exception时可能会损坏)正在保存程序数据以供以后恢复。 之后,应用程序域被卸载并且应用程序终止。
从.NET 4开始,除非事件处理程序对安全至关重要,并且具有HandleProcessCorruptedStateExceptionsAttribute
特性,否则不会引发此事件,从而破坏进程状态(例如堆栈溢出或访问冲突)。
有关更多详细信息,请参阅MSDN 。
好的 – 我把它放在了我面前,从msdn的这段代码是不言而喻的:
public static void Main(string[] args) { // Add the event handler for handling UI thread exceptions to the event. Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException); // Set the unhandled exception mode to force all Windows Forms // errors to go through our handler. Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); // Add the event handler for handling non-UI thread exceptions to the event. AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); // Runs the application. Application.Run(new ErrorHandlerForm()); }
那么事情是,由于你的线程出现问题而发生ThreadException
,如果你的代码抛出了一个没有被处理的exception,就会触发Unhandled Exception
。
导致第二个的简单方法是创build一个没有try … catch块的应用程序,并抛出一个exception。
现在,如果你需要保险,你可以同时处理它们,但是如果你正确地捕获和处理你的exceptions
,那么你不应该需要UnhandledException
处理程序,因为它有点像捕获所有。