【发布时间】:2014-01-31 12:07:48
【问题描述】:
我们有一项服务可以在应用程序域级别(通过 Log4net)记录未处理的异常。
我们登录了:
2014-01-28 16:49:19,636 错误 [49] FeedWrapperService - 未处理 System.NullReferenceException:对象引用未设置为对象的实例。
此异常没有堆栈跟踪。如果不对异常对象做一些疯狂的事情,这怎么可能?
我们的处理代码:
AppDomain.CurrentDomain.UnhandledException += LogAnyExceptions;
private void LogAnyExceptions(object sender, UnhandledExceptionEventArgs e)
{
log.Error("unhandled", (Exception)e.ExceptionObject);
throw (Exception)e.ExceptionObject;
}
在我看来,这里的重新抛出是没有意义的,因为无论如何 AppDomain 都会随着进程而下降,但我认为这不会影响我们的情况。
Windows 应用程序事件查看器也只显示这个空引用异常并且没有跟踪。
我已经测试了异常处理程序日志记录,它成功地记录了堆栈跟踪和任何内部异常。如果它是由我们的代码抛出的,我们会看到一个堆栈跟踪。如果它是由第 3 方 c# 库抛出的,那么我们将再次看到至少一个方法的堆栈跟踪(无论它是否是重新抛出的异常)。在这里,我们看到一个没有堆栈跟踪的托管异常。我不知道这怎么可能。
查看它与非托管代码对话的反编译的第 3 方库,引发此异常的事件很可能在非托管领域,但这种情况如何导致没有堆栈跟踪的托管空引用异常?
此问题的原因是间歇性的。我们已经在生产环境中运行了这个代码几个月,并且看到它这样做过一次。太诡异了。
普遍的共识是,应该将负责此类问题的系统推到子进程中,以便我们可以处理问题并安全自动地重新启动,但最好知道发生了什么。
编辑以包含下面的评论信息:
我的异常不是标准的重新抛出,因为堆栈跟踪为空或空。它没有重新抛出方法的名称。进一步挖掘,可以从序列化信息构造 Exception 类,并且看起来序列化信息可能包含用于堆栈跟踪的空字符串,并且可能在创建时不会导致其他错误。我猜它可能来自那里,但我不知道它是如何产生的。
【问题讨论】:
-
This thread 可能会有所帮助
-
手指戳:尝试检查
Environment.StackTrace可能还有内部异常? -
@Andrei 读起来很有趣,但我的异常在它的堆栈跟踪中甚至没有一个方法,如果它是一个正常的重新抛出,我会拥有的。进一步挖掘,可以从序列化信息构造 Exception 类,并且看起来序列化信息可以包含用于堆栈跟踪的空字符串而不会导致错误。我猜它可能来自那里,但我不知道它是如何起源的。
标签: c# exception stack-trace unhandled-exception