处理Application.ThreadException和在Try/Catch中包装Application.Run之间的区别

kev*_*v22 3 c# exception-handling winforms

是否有任何理由更喜欢在Windows窗体应用程序中实现全局异常处理程序的这些方法之一?

第一种方法

static void Main(string[] args) 
{
    try
    {
        System.Windows.Forms.Application.Run(mainform);
    }
    catch (Exception ex)
    {
        // Log error and display error message
    }
}
Run Code Online (Sandbox Code Playgroud)

第二种方法

static void Main(string[] args) 
{
    System.Windows.Forms.Application.ThreadException += 
        new ThreadExceptionEventHandler(Application_ThreadException);
    System.Windows.Forms.Application.Run(mainform);
}

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
    // Log error and display error message
}
Run Code Online (Sandbox Code Playgroud)

处理ThreadException事件会给你一些try/catch没有的东西吗?

com*_*ech 5

我对这种行为的理解是,添加一个ThreadException处理程序将导致该处理程序捕获和处理表单中未处理的异常,这将允许应用程序继续运行.

在try/catch设计中,表单中的第一个未处理的异常将导致应用程序停止.您将捕获异常,但应用程序将结束.

请注意,还有一个AppDomain.UnhandledException事件将在某些情况下引发(在主窗口形式线程以外的线程中未处理的异常并且没有捕获ThreadException),所有这些都是对您的应用程序非常不利的消息.