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

问题描述 投票:104回答:4

好的,这很简单:

  • Application.ThreadExceptionAppDomain.CurrentDomain.UnhandledException有什么区别?

  • 我需要同时处理两者吗?

谢谢!

c# .net winforms exception-handling
4个回答
96
投票
该后台程序将触发Application.ThreadException事件。如果您不覆盖它,则用户将获得一个ThreadExceptionDialog。这使他可以忽略异常并继续运行您的程序。不好意思。

您可以通过在Program.cs的Main()方法中调用Application.SetUnhandledExceptionMode()来禁用此行为。没有适当的支持,当线程因未处理的异常而死亡时,通常会发生这种情况:AppDomain.UnhandledException触发并且程序终止。

Fwiw:“ ThreadException”是一个非常糟糕的名称选择。它与线程无关。


34
投票

在使用Windows窗体的应用程序中,未处理的异常主应用程序线程导致

Application.ThreadException即将举行的活动。如果处理了此事件,则默认行为是未处理的异常不会终止应用程序,尽管应用程序处于未知状态。在这种情况下,UnhandledException事件未引发。此行为可以是使用应用程序配置文件或使用Application.SetUnhandledExceptionMode将模式更改为UnhandledExceptionMode.ThrowException之前的ThreadException事件处理程序已连接。这仅适用于主应用程序线。引发UnhandledException事件以处理未处理的事件其他线程中抛出的异常。

Visual Studio 2005]开始,

Visual Basic

应用程序框架为主体中未处理的异常提供了另一个事件应用程序线程-WindowsFormsApplicationBase.UnhandledException。此事件有一个事件参数对象,其名称与事件参数对象由AppDomain.UnhandledException使用,但带有不同的属性。特别是,此事件参数对象具有ExitApplication属性,允许应用程序继续运行,忽略未处理的异常(并离开应用程序处于未知状态)。在这种情况下,AppDomain.UnhandledException事件未引发。

Application.ThreadException可以被捕获,并且应用程序可以继续
(通常不是一个好主意,但是对于像定期运行某些操作这样的应用程序,这是一个很好的解决方案)。

要捕获在非Windows窗体创建和拥有的线程中发生的异常,请使用AppDomain.UnhandledException

。它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。

处理此异常不会阻止应用程序终止。可以做的最大工作(如果不处理异常,则程序数据可能会损坏)正在保存程序数据,以便以后进行恢复。之后,将应用程序域卸载并终止应用程序。

。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由于线程问题而发生,如果您的代码抛出未处理的异常,则会触发Unhandled Exception
导致第二个错误的简便方法是创建一个没有try ... catch块的应用程序,并引发异常。

现在,如果您需要保险,您可以同时处理这两种保险,但是,如果您正确地捕获并处理了exceptions,那么您就不需要UnhandledException处理程序,因为这有点像万能险。


18
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.