【问题标题】:Difference between handling Application.ThreadException and wrapping Application.Run in Try / Catch在 Try / Catch 中处理 Application.ThreadException 和包装 Application.Run 之间的区别
【发布时间】:2012-01-17 04:01:07
【问题描述】:

是否有任何理由更喜欢其中一种在 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 没有的东西?

【问题讨论】:

  • 第一种方法甚至不能在发布模式下工作,即当你运行你的 exe 时,这将是一个未处理的异常,你将不会到达 catch 块;仅在使用 Visual Studio 时有效。试试看,在主窗体中放置一个按钮并在那里抛出异常。

标签: c# winforms exception-handling


【解决方案1】:

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

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

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

【讨论】:

  • 啊,谢谢,现在您指出这一点实际上非常明显。感谢您的帮助。
【解决方案2】:

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

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

【讨论】:

  • 非常感谢您的帮助。我会给你支票,但另一个答案让你领先 8 秒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
相关资源
最近更新 更多