【问题标题】:Catching exceptions from Application.Run() [duplicate]从 Application.Run() 捕获异常 [重复]
【发布时间】:2014-03-10 08:50:44
【问题描述】:

我的项目中有这个标准代码:

try {
    myForm = new MyForm();
    Application.Run(myForm);
} catch (Exception e) {
    // handle all uncaught exceptions
}

但是,当我的程序中某处出现未处理的异常时,它仍然显示“默认”异常处理程序,并且我的 catch 永远不会被命中。我想将某些致命错误作为已知的致命错误(例如连接丢失)来处理。

【问题讨论】:

  • @Jehof 不完全是。我不想捕获 all 未处理的异常。只是一些致命的,可能发生在程序的任何地方。我仍然希望未知问题未被发现(因为它提供了很好的调试信息)。
  • @BartFriederichs 所有未处理的异常都是致命的
  • @SergeyBerezovskiy 我明白了。我可能没有解释清楚。我的应用程序使用数据库连接并丢失它,并不一定意味着致命(例如,我可以尝试重新连接),但我现在想将其视为致命。问题是,这个异常可以在我的程序中的任何地方抛出(这个错误的基础是一个设计错误,但我现在无法修复它),所以我想抓住它并让它致命,并用用户友好的消息关闭应用程序。
  • @BartFriederichs 如果您在主线程上有数据库操作,您应该能够使用 ThreadException 捕获异常。您也可以使用 AppDomain 的 UnhandledException 事件,请参阅链接问题

标签: c# winforms


【解决方案1】:

一种可能性是AppDomain.UnhandledException。更多详情请看这里:

另外,这里有一篇较旧但仍然很棒的文章:

【讨论】:

    【解决方案2】:

    你可以试试这样的

     myForm = new MyForm();
     Application.Run(myForm);
     Application.ThreadException +=
             new ThreadExceptionEventHandler(Application_ThreadException);
    

    然后像这样使用这个事件

        static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
        {
          try
          {
              // Your code
          }
         catch (Exception ex)
         {
              // your code
         }
       }
    

    【讨论】:

    • 效果很好,但是事件必须在Application.Run(myForm);之前调用;
    猜你喜欢
    • 1970-01-01
    • 2020-12-17
    • 2012-07-13
    • 2011-12-07
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    相关资源
    最近更新 更多