gpt4 book ai didi

c# - 没有堆栈跟踪的异常 - 怎么样?

转载 作者:可可西里 更新时间:2023-11-01 03:01:05 25 4
gpt4 key购买 nike

我们有一项服务可以在应用域级别记录未处理的异常(通过 Log4net)。

我们记录了:

2014-01-28 16:49:19,636 ERROR [49] FeedWrapperService - unhandled System.NullReferenceException: Object reference not set to an instance of an object.

此异常没有堆栈跟踪。如果不对异常对象做一些疯狂的事情怎么可能呢?

我们的处理代码:

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 异常而没有跟踪。

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

查看反编译的第 3 方库,它与非托管代码对话,引发此异常的事件很可能在非托管领域,但这种情况怎么会导致没有堆栈跟踪的托管 null ref 异常?

此问题的原因是间歇性的。我们已经在生产环境中运行这段代码几个月了,并且看到它执行过一次。这很奇怪。

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

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

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

最佳答案

如果您收到异常但没有相应的堆栈跟踪,那么在某个时候异常处理程序可能正在评估异常并错误地重新抛出它。例如,如果您正在执行 throw ex;,您将吃掉导致该点的堆栈跟踪。要保留现有的调用堆栈,您只需 throw; Throwing exceptions best practices

请注意,C# 方式与 Java 语言的约定相反,在 Java 语言中您应该throw ex; Java 引用:Best Practice: Catching and re-throwing Java Exceptions

关于c# - 没有堆栈跟踪的异常 - 怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21479762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com