关于c#:Exception超越了Application.ThreadException和AppDomain.CurrentDomain.UnhandledException

关于c#:Exception超越了Application.ThreadException和AppDomain.CurrentDomain.UnhandledException

Exception getting past Application.ThreadException and AppDomain.CurrentDomain.UnhandledException

我遇到了一个应用程序挂起的问题,并给了我默认的"请告诉Microsoft有关此问题"的弹出窗口,而不是应用程序中的"未处理的异常"对话框。

在应用程序代码中,Application.ThreadException和AppDomain.CurrentDomain.UnhandledException都被重定向到将错误日志写入磁盘,将屏幕快照保存到磁盘并显示友好对话框的方法。

但是,当发生此错误时,这三件事均不会发生。我得到的只是事件查看器中的代码:

EventType clr20e3,P1 myapp.exe,P2 4.0.0.0,P3 47d794d4,P4 mscorlib,P5 2.0.0.0,P6 471ebc5b,P7 15e5,P8 27,P9 system.argumentoutofrange,P10 NIL

鉴于该错误似乎仅在应用程序运行了几个小时后才发生,所以我想知道这是否可能是内存泄漏问题。我已经搜索了" clr20e3",但只设法找到了ASP.Net。我的应用程序是Windows Forms(.Net 2.0)exe,使用相当多的程序集-在C#和一些非托管C ++中。

我猜这也可能是错误处理方法中的错误-正如一些答案所暗示的,我可以尝试在错误处理程序的开始处进行日志记录(但是考虑到这无论如何我都要做的...)。

任何解决此问题的帮助将不胜感激-无论是解决方案,还是有关如何找出问题根源的建议。

更新:原始错误的根本原因是访问具有负索引的数组(即system.argumentoutofrange)。为什么这没有被捕获对我来说还是个谜,但是鉴于两个异常都被发送到了相同的处理代码,我想知道是否不存在这样的情况:(例如)两者都被调用并争用资源(例如,日志文件)?

我通过在错误处理代码中的任何其他操作之前执行EventLog.WriteEntry来证明了这一点。现在添加了一个标志来防止错误处理再次输入,我似乎不再有问题...


您是否检查过ArgumentOutOfRangeException是否从处理程序本身抛出? 可能值得对事件日志或异常处理程序条目处的跟踪进行简单的写入,并确认您确实在击中它。

编辑:可以在以下位置找到写入事件日志的信息:

http://support.microsoft.com/kb/307024


只是在这里黑暗中射击-ArgumentOutOfRangeException是否实际上是从异常处理程序中抛出的?

此外,您没有说出问题类型的应用程序-Application.ThreadException仅影响WinForms线程,因此,如果这不是GUI应用程序,那就没有用了。 (请参阅MSDN文档中的"备注"部分)


您是否多次调用Application.Run()? 这将显示您描述的相同符号。 您必须编写一个自定义ApplicationContext类作为解决方法。 仅调整了我的$ 0.02(根据通货膨胀)。


推荐阅读