c# - 处理未处理的异常问题

标签 c# exception

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

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

但它并没有像我预期的那样工作。当我在 Debug模式下启动应用程序并引发异常时,它确实调用了处理程序,但之后 Visual Studio 中的异常助手弹出,就好像异常发生时没有任何处理。我在处理程序中尝试了 Application.Exit(),但效果不佳。

我想要实现的是用我的处理程序处理异常,然后应用程序正常关闭。有没有其他方法可以做到这一点,或者我是否以错误的方式使用了上面的代码?

最佳答案

通常我使用类似这样的东西来 try catch 所有意外的顶级异常。

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 方法中包含您的顶级异常处理。

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

  1. 按照您认为合适的方式显示/记录异常
  2. 确保退出/终止应用程序进程

如果您认为第二项很奇怪,请记住,我们一开始只是在非常特殊的情况下才会费心这样做。这些事情可能是错误,需要更改您的应用程序才能准确解决。任何其他异常处理 - 函数式 - 应该在您的实际程序代码中降低,在有意义的地方捕获特定类型的异常并以有意义的方式在那里处理它们。其他任何东西都应该冒泡到你的 FatalExceptionHandler 以让自己知道并阻止可能有缺陷的程序从损坏的状态运行

死程序不会说谎......;-)

关于c# - 处理未处理的异常问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/406385/

相关文章:

c# - .NET 中快速紧凑的对象序列化

C# '|' 运算符和参数

python - Swift 异常处理 vs python 异常

windows - 以编程方式向 Windows Vista 防火墙添加异常(exception)

c - 尝试将 char 指针附加到固定字符串时出现内存异常

java - 没有这样的方法: JRE picks wrong class if ambiguous occurs

c# - 使用 SSH.NET 连接到远程主机

c# - 我如何理解 visual studio profiler 报告?

c# - sqlCommand 并以编程方式检索和设置存储过程的参数

c++ - 在 catch block 中重新抛出异常