在WPF应用程序中全局捕获异常?

我们有一个WPF应用程序,其中的一部分可能会在运行时抛出异常。 我想全局捕捉任何未处理的异常并将它们记录下来,但是否则继续程序执行,就好像什么也没发生一样(有点像VB的On Error Resume Next )。

这在C#中可能吗? 如果是这样,我需要把异常处理代码放在哪里?

目前我看不到任何单一点,我可以将try / catch包装起来,并捕获所有可能发生的异常。 即使如此,我也会因为这个问题而留下任何已经被处决的事情。 或者我在这里考虑可怕的错误方向?

ETA:由于以下许多人指出:该应用不适用于控制核电站。 如果它崩溃,那不是什么大不了的事情,但随机的例外大多与UI相关,在使用它的上下文中是令人讨厌的。 有些(可能还有)其中的一些,因为它使用插件架构,并可能被其他人(也就是这种情况下的学生;因此没有经验丰富的开发人员能够编写完全无误的代码)进行扩展。

至于被捕获的异常:我将它们记录到日志文件中,包括完整的堆栈跟踪。 这是这个练习的重点。 只是为了对付那些正在逐字逐句向VB的OERN类推的人。

我知道盲目地忽略某些类别的错误是危险的,并且可能会破坏我的应用程序实例。 如前所述,这个程序对任何人都不是关键任务。 没有人会用正确的心态来打赌人类文明的存在。 这只是一个测试某些设计方法的小工具。 软件工程。

为了立即使用应用程序,在例外情况下可能会发生很多事情:

  • 没有异常处理 - 错误对话框和应用程序退出。 实验必须重复,但可能与另一个主题。 没有记录错误,这是不幸的。
  • 一般异常处理 - 被困的良性错误,没有损害。 这应该是我们在开发过程中看到的所有错误判断的常见情况。 忽视这种错误应该不会有直接的后果; 核心数据结构经过了充分测试,可以轻松实现。
  • 通用的异常处理 - 严重的错误被困,可能会在以后出现崩溃。 这可能很少发生。 到目前为止,我们从未见过它。 无论如何都会记录错误,崩溃可能是不可避免的。 所以这在概念上与第一种情况类似。 除了我们有一个堆栈跟踪。 在大多数情况下,用户甚至不会注意到。
  • 至于程序产生的实验数据:最严重的错误会导致没有数据被记录。 微妙的变化很少会改变实验的结果。 即使在这种情况下,如果结果看起来可疑,记录的错误也会记录下来; 如果它总是异常值,仍然可以丢弃该数据点。

    总结:是的,我认为自己仍然至少有一部分是理智的,并且我不认为全局异常处理程序会导致程序运行必然是完全邪恶的。 如前所述,这种决定可能是有效的,这取决于应用程序。 在这种情况下,它被判断为一个有效的决定,而不是完全和彻底的废话。 对于任何其他应用程序,该决定看起来可能不同 但请不要指责我或其他从事这个项目的人,因为我们忽略了错误而可能炸毁世界。

    注意:该应用程序只有一个用户。 它不像Windows或Office那样被数百万用户所使用,其中异常冒泡的成本根本不同于其他用户。


    使用Application.DispatcherUnhandledException Event 。 看到这个问题的总结(请参阅Drew Noakes的答案)。

    请注意,仍会有例外情况妨碍应用程序的成功恢复,例如在尝试保存到数据库时出现堆栈溢出,内存耗尽或网络连接丢失等情况。


    AppDomain.UnhandledException事件

    此事件提供未捕获异常的通知。 它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。

       public App()
       {
          AppDomain currentDomain = AppDomain.CurrentDomain;
          currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);    
       }
    
       static void MyHandler(object sender, UnhandledExceptionEventArgs args) 
       {
          Exception e = (Exception) args.ExceptionObject;
          Console.WriteLine("MyHandler caught : " + e.Message);
          Console.WriteLine("Runtime terminating: {0}", args.IsTerminating);
       }
    

    如果在默认的应用程序域中处理了UnhandledException事件,则会在其中引发任何线程中的任何未处理的异常,而不管该线程在哪个应用程序域中启动。如果线程在具有UnhandledException的事件处理程序的应用程序域中启动,该事件在该应用程序域中引发。 如果该应用程序域不是默认应用程序域,并且在默认应用程序域中还有一个事件处理程序,则会在两个应用程序域中引发该事件。

    例如,假设线程在应用程序域“AD1”中启动,调用应用程序域“AD2”中的方法,然后从那里调用应用程序域“AD3”中的方法,在该方法中抛出异常。 可以引发UnhandledException事件的第一个应用程序域是“AD1”。 如果该应用程序域不是默认应用程序域,则该事件也可以在默认应用程序域中引发。


    另外还有其他人在此提到,请注意将Application.DispatcherUnhandledException (及其类似者)与

    <configuration>
      <runtime>  
        <legacyUnhandledExceptionPolicy enabled="1"/>
      </runtime>
    </configuration>
    

    在app.config中将阻止您的辅助线程异常关闭应用程序。

    链接地址: http://www.djcxy.com/p/25879.html

    上一篇: Globally catch exceptions in a WPF application?

    下一篇: The case against checked exceptions