代码之家  ›  专栏  ›  技术社区  ›  Benjol

通过application.threadexception和appdomain.currentdomain.unhandledException时出现异常

  •  4
  • Benjol  · 技术社区  · 16 年前

    我有一个应用程序挂起问题,给了我默认的“请告诉微软这个问题”弹出窗口,而不是应用程序中的“未处理的异常”对话框。

    在应用程序代码中,application.threadexception和appdomain.currentdomain.unhandledexception都被重定向到将错误日志写入磁盘、将屏幕截图保存到磁盘并显示友好对话框的方法。

    但当这个错误发生时,这三件事都没有发生。我只在事件查看器中得到:

    事件类型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窗体(.NET 2)EXE,使用了相当多的程序集——C和一些非托管C++。

    我想这也可能是错误处理方法中的一个错误-正如一些答案所建议的,我可以尝试在错误处理程序的开头进行日志记录(但是考虑到这几乎就是我所做的…)。

    任何帮助解决这个问题的人都会非常感激——无论是解决方案,还是如何找出问题根源的建议。

    更新:原始错误的根本原因是访问索引为负的数组(即System.ArgumentOutOfRange)。为什么这没有被捕获对我来说有点神秘,但考虑到这两个异常都被发送到同一个处理代码,我想知道是否可能没有这样一个条件,即(例如)调用和争夺一个资源(例如,日志文件)?

    我在错误处理代码中做了其他事情之前,先做了一个eventlog.writeEntry,以此证明了这一点。现在添加了一个标志以防止在错误处理中重新进入,我似乎不再有问题…

    3 回复  |  直到 16 年前
        1
  •  1
  •   Tomer Gabel    16 年前

    在黑暗中拍摄-有没有可能ArgumentOutOfRangeException实际上是从您的异常中抛出的? 处理程序 ?

    另外,您没有说什么类型的应用程序有问题——application.threadexception只影响winforms线程,所以如果这不是一个GUI应用程序,它就没用了。(参见 MSDN documentation )

        2
  •  1
  •   Wolfwyrd    16 年前

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

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

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

        3
  •  0
  •   Daniel P. Bullington    14 年前

    是否多次调用application.run()?这将表现出与你描述的相同的症状。您必须编写一个自定义的applicationContext类作为解决方案。只是我的0.02美元的通货膨胀调整。