Application.ThreadException 和 AppDomain.CurrentDomain.UnhandledException 有什么区别?

好吧,这个很简单:

  • Application.ThreadException和 < br > AppDomain.CurrentDomain.UnhandledException有什么区别?

  • 我需要同时处理这两件事吗?

谢谢!

29361 次浏览

事情是这样的,ThreadException是由于线程的问题而发生的,如果代码抛出一个未处理的异常,那么就会触发 Unhandled Exception

导致第二个错误的简单方法是创建一个没有 try 的应用程序... ... 捕获块并抛出异常。

现在,如果你需要保险,你可以处理他们两个,但是,如果你捕获和处理你的 exceptions正确,那么你不应该需要 UnhandledException处理程序,因为它有点像一个捕获所有。

好的-我已经把它放在我面前了,这段来自 我不知道的代码非常简单明了:

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 特定于 Windows 窗体。Winforms 运行事件处理程序以响应 Windows 发送给它的消息。例如 Click 事件,我相信你知道它们。如果这样一个事件处理程序抛出一个异常,那么在 Winforms 消息循环中就有一个捕获该异常的后台停止。

该后台程序触发 应用程序。 ThreadException事件。如果不覆盖它,用户将得到一个 对话框。这使他可以忽略异常并继续运行您的程序。顺便说一句,这不是个好主意。

可以通过在 Program.cs 中的 Main ()方法中调用 应用程序来禁用此行为。如果没有备份,当一个线程因为未处理的异常而死亡时,通常会发生这样的事情: 应用程序域。未处理异常触发,程序终止。

Fwiw: “ ThreadException”是一个非常糟糕的名称选择,它与线程没有任何关系。

来自 来源:

在使用 Windows 窗体的应用程序中,在 主应用程序线程导致 Application.ThreadException 如果处理了此事件,则默认行为为 未处理的异常不会终止应用程序, although the application is left in an unknown state. In that case, 未引发 UnhandledException事件。此行为可以是 通过使用应用程序配置文件或通过使用 方法将模式更改为 UnhandledExceptionMode.ThrowExceptionThreadException之前 事件处理程序。这仅适用于主应用程序 引发未处理的 UnhandledException事件 在其他线程中抛出的异常。

Visual Studio 2005(VisualBasic应用程序)开始 框架为 main 中未处理的异常提供了另一个事件 应用程序线程 -WindowsFormsApplicationBase.UnhandledException。 This event has an event arguments object with the same name as the 事件参数对象,但使用 different properties. In particular, this event arguments object has an ExitApplication property that allows the application to continue 运行,忽略未处理的异常(并离开应用程序) 在这种情况下,AppDomain 事件。

可以捕获 Application.ThreadException申请可以继续(一般来说这不是一个好主意,但是对于像周期性运行某些操作这样的应用程序来说,这是一个很好的解决方案)。

若要捕获在不由 Windows 窗体创建和拥有的线程中发生的异常,请使用 AppDomain.UnhandledException。它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。< br > 此异常的处理不会阻止终止应用程序。 < br > 可以做的最大事情(当不处理异常时程序数据可能会损坏)是保存程序数据以便以后恢复。之后,卸载应用程序域并终止应用程序。

.NET 4开始,不会对异常引发此事件 会破坏进程的状态,例如堆栈溢出或 访问冲突,除非事件处理程序是安全关键的,并且 具有 HandleProcessCorruptedStateExceptionsAttribute属性。

有关详细信息,请参阅 MSDN