在使用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
处理程序,因为这有点像万能险。