Ray*_*Ray 26 .net c# exception-handling exception
我正在维护一个.NET 1.1应用程序,我所负责的任务之一是确保用户没有看到任何不友好的错误通知.
我已经添加了处理程序Application.ThreadException
和AppDomain.CurrentDomain.UnhandledException
,这也被调用.我的问题是仍然显示标准CLR错误对话框(在调用异常处理程序之前).
杰夫这个问题在他的博客谈到这里和这里.但是没有解决方案.那么.NET 1.1中处理未捕获异常和显示友好对话框的标准方法是什么?
杰夫的回答被标记为正确答案,因为他提供的链接提供了有关如何执行所需操作的最完整信息.
AppDomain.UnhandledException是一个事件,而不是全局异常处理程序.这意味着,在它被引发的时候,你的应用程序已经开始流失了,除了进行清理和错误记录之外,你无能为力.
幕后发生的事情是:框架检测到异常,将调用堆栈向上移动到顶部,找不到可以从错误中恢复的处理程序,因此无法确定继续执行是否安全.因此,它开始关闭序列,并且为了礼貌而启动此事件,以便您可以对已经注定的过程表示敬意.当在主线程中未处理异常时会发生这种情况.
这种错误没有单点解决方案.您需要在发生此错误的所有位置的上游放置一个真正的异常处理程序(catch块)并将其转发到(例如)全局处理程序方法/类,以确定是否可以安全地简单地报告并继续,基于异常类型和/或内容.
编辑:可以禁用(= hack)Windows内置的错误报告机制,以便在应用程序关闭时不会显示强制性的"崩溃和刻录"对话框.但是,这对系统中的所有应用程序都有效,而不仅仅是您自己的应用程序.
.NET 1.x Windows窗体应用程序中未处理的异常行为取决于:
未处理的异常的默认行为是:
未处理的例外的联系点是:
Windows窗体内置异常处理默认情况下执行以下操作:
您可以通过在App.Config中设置jitDebugging = true来禁用后一种行为.但请记住,这可能是您停止应用终止的最后机会.因此,捕获未处理异常的下一步是注册事件Application.ThreadException,例如:
Application.ThreadException += new
Threading.ThreadExceptionHandler(CatchFormsExceptions);
Run Code Online (Sandbox Code Playgroud)
请注意HKEY_LOCAL_MACHINE\Software.NetFramework下的注册表设置DbgJitDebugLaunchSetting.这是我所知道的三个值中的一个:
在Visual Studio中,转到菜单工具 → 选项 → 调试 → JIT将此键设置为0或2.但是值1通常最适合最终用户的计算机.请注意,在CLR未处理的异常事件之前,此注册表项已执行.
最后一个事件是您记录未处理异常的最后机会.在您的Finally块执行之前触发它.您可以按如下方式拦截此事件:
AppDomain.CurrentDomain.UnhandledException += new
System.UnhandledExceptionEventHandler(CatchClrExceptions);
Run Code Online (Sandbox Code Playgroud)