当前位置:  开发笔记 > 编程语言 > 正文

处理未处理的异常问题

如何解决《处理未处理的异常问题》经验,为你挑选了3个好方法。

我想为我可能没有在代码中捕获的所有意外异常设置一些处理程序.在Program.Main()我使用以下代码:

AppDomain.CurrentDomain.UnhandledException
    += new UnhandledExceptionEventHandler(ErrorHandler.HandleException);

但它并没有像我预期的那样奏效.当我在调试模式下启动应用程序并抛出异常时,它确实调用了处理程序,但之后Visual Studio中的异常帮助程序弹出,好像发生了异常而没有任何处理.我在处理程序中尝试了Application.Exit(),但它也没有用.

我想要实现的是异常是用我的处理程序处理的,然后应用程序很好地关闭.有没有其他方法可以做到这一点,还是我以错误的方式使用上面的代码?



1> peSHIr..:

通常我会使用类似的东西来尝试捕获所有意外的顶级异常.

using System;

static class Program
{
  [STAThread]
  static void Main(string[] argv)
  {
    try
    {
      AppDomain.CurrentDomain.UnhandledException += (sender,e)
      => FatalExceptionObject(e.ExceptionObject);

      Application.ThreadException += (sender,e)
      => FatalExceptionHandler.Handle(e.Exception);

      // whatever you need/want here

      Application.Run(new MainWindow());
    }
    catch (Exception huh)
    {
      FatalExceptionHandler.Handle(huh);
    }
  }

  static void FatalExceptionObject(object exceptionObject) {
    var huh = exceptionObject as Exception;
    if (huh == null) {
      huh = new NotSupportedException(
        "Unhandled exception doesn't derive from System.Exception: "
         + exceptionObject.ToString()
      );
    }
    FatalExceptionHandler.Handle(huh);
  }
}

也许这是你觉得有用的东西?这个主代码通过一个方法调用路由所有三种捕获意外顶级异常的方法.您现在需要的只是一个静态类FatalExceptionHandler,其中包含您的方法中的顶级异常处理Handle.

实际上,任何应用程序开发人员都知道实际上只有两件事要做:

    显示/记录您认为合适的异常

    确保退出/终止应用程序进程

如果您认为第二项是奇怪的,请记住,我们只是为了非常特殊的情况而在第一时间做这件事.这些东西可能是需要更改应用程序才能准确解决的错误.任何其他异常处理 - 功能类型 - 应该在实际程序代码中降低,捕获特定类型的异常,这是有意义的,并以有意义的方式处理它们.任何其他事情都应该冒泡到你的身上FatalExceptionHandler让自己知道并阻止可能残缺的程序从腐败状态开始工作

死程序没有说谎...... ;-)



2> Peter Lindho..:

这是因为您在调试模式下通过Visual Studio运行它.如果您在其他地方发布并安装应用程序,则只会处理您的全局异常处理程序.



3> Marc Gravell..:

请注意,未处理的异常仍然非常致命; 你只能真正用它来记录,或者可能是一些仓促的关闭.这既不是Application.ThreadException也不能用作错误的全局汇.

更好的方法是添加适当的处理 - 例如,围绕整个Main()逻辑.请注意,即使这样也无法捕获一些异常,例如表单加载期间的错误(特别令人讨厌 - 您可以使用附加的调试器捕获它们,但不是没有).

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有