C# 没有堆栈跟踪的异常-如何?

C# 没有堆栈跟踪的异常-如何?,c#,exception,stack-trace,unhandled-exception,C#,Exception,Stack Trace,Unhandled Exception,我们有一个服务,它将在应用程序域级别(通过Log4net)记录未处理的异常 我们记录: 2014-01-28 16:49:19636错误[49]Feedwrapper服务-未处理 System.NullReferenceException:对象引用未设置为对象的实例 此异常没有堆栈跟踪。如果不对异常对象执行一些疯狂的操作,这怎么可能呢 我们的处理代码: AppDomain.CurrentDomain.UnhandledException += LogAnyExceptions; private

我们有一个服务,它将在应用程序域级别(通过Log4net)记录未处理的异常

我们记录:

2014-01-28 16:49:19636错误[49]Feedwrapper服务-未处理 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应用程序事件查看器也仅显示此null ref异常,不显示任何跟踪

我已经测试了异常处理程序日志记录,它成功地记录了堆栈跟踪和任何内部异常。如果它是由我们的代码抛出的,我们将看到堆栈跟踪。如果它是由第三方c#库抛出的,那么我们将再次看到至少一个方法的堆栈跟踪(无论它是否是重新抛出的异常)。这里我们看到一个没有堆栈跟踪的托管异常。我不知道这怎么可能

查看反编译的第三方库,它与非托管代码对话,引发此异常的事件可能发生在非托管区域,但这种情况如何会导致没有stacktrace的托管null ref异常

此故障的原因是间歇性的。我们已经在生产环境中运行这段代码好几个月了,并且见过它这样做过一次。这很奇怪

普遍的共识是,负责这类问题的系统应该被推到子进程中,这样我们就可以处理问题并安全自动地重新启动,但最好知道发生了什么

编辑以包含以下评论信息:


我的异常不是标准的重新抛出,因为堆栈跟踪要么为null,要么为空。它没有重新抛出方法的名称。进一步挖掘,可以从序列化信息构造异常类,并且看起来序列化信息可能包含堆栈跟踪的空字符串,并且可能在不导致其他错误的情况下创建该字符串。我猜它可能来自那里,但我不知道它是如何产生的。

如果您接收到异常,但没有相应的堆栈跟踪,那么在某个时候,异常处理程序可能正在评估异常并错误地重新抛出它。例如,如果你正在做一个
抛出ex您将吃掉指向该点的堆栈跟踪。要保留现有的调用堆栈,只需
抛出


请注意,C#方式与Java语言的约定相反,您应该
抛出exJava参考:

我更喜欢使用自定义异常管理我的异常,如果您使用自己的异常,您可以在定义它们时访问类并覆盖stacktrace。e、 g:

public class YourCustomException: Exception
{
    public YourCustomException() : base() { } //constructor

    public override string StackTrace 
    {
        get { return "Message instead stacktrace"; }
    }
}

may helpFinger poking:尝试检查,也许是内部异常?@Andrei这是一个有趣的阅读,但我的异常在堆栈跟踪中甚至没有一个方法,如果它是正常的重新抛出,我会有。进一步挖掘,可以从序列化信息构造异常类,并且看起来序列化信息可以包含堆栈跟踪的空字符串,而不会导致错误。我想它可能来自那里,但我不知道它是如何起源的。