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

时间:2011-12-09 22:42:24

标签: c# winforms exception-handling

是否有理由更喜欢在Windows窗体应用程序中实现全局异常处理程序的其中一种方法而不是另一种?

第一种方法

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

第二种方法

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
}

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

2 个答案:

答案 0 :(得分:5)

我对此行为的理解是,添加ThreadException处理程序将导致此处理程序捕获并处理表单中未处理的异常,这将允许应用程序继续运行。

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

请注意,在某些情况下还会引发AppDomain.UnhandledException事件(主窗口表单线程以外的线程中未处理的异常并且没有捕获ThreadException),所有这些对您来说都是非常坏的消息应用

答案 1 :(得分:2)

事件处理程序方法允许您的应用程序捕获异常,尝试从中恢复并继续。 (即执行不离开Application.Run

main中的try/catch会捕获异常,但您将离开Application.Run,此时您可以做的就是退出。