我想为我可能没有在代码中捕获的所有意外异常设置一些处理程序.在Program.Main()
我使用以下代码:
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(ErrorHandler.HandleException);
但它并没有像我预期的那样奏效.当我在调试模式下启动应用程序并抛出异常时,它确实调用了处理程序,但之后Visual Studio中的异常帮助程序弹出,好像发生了异常而没有任何处理.我在处理程序中尝试了Application.Exit(),但它也没有用.
我想要实现的是异常是用我的处理程序处理的,然后应用程序很好地关闭.有没有其他方法可以做到这一点,还是我以错误的方式使用上面的代码?
通常我会使用类似的东西来尝试捕获所有意外的顶级异常.
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
让自己知道并阻止可能残缺的程序从腐败状态开始工作
死程序没有说谎...... ;-)
这是因为您在调试模式下通过Visual Studio运行它.如果您在其他地方发布并安装应用程序,则只会处理您的全局异常处理程序.
请注意,未处理的异常仍然非常致命; 你只能真正用它来记录,或者可能是一些仓促的关闭.这既不是Application.ThreadException
也不能用作错误的全局汇.
更好的方法是添加适当的处理 - 例如,围绕整个Main()
逻辑.请注意,即使这样也无法捕获一些异常,例如表单加载期间的错误(特别令人讨厌 - 您可以使用附加的调试器捕获它们,但不是没有).