我们如何解决终结器抛出的未处理异常,显然是不是来自我们的代码?
通过事件AppDomain.CurrentDomain.UnhandledException
,我们偶尔会记录一个Exception,它不是来自我们的代码,而是正在终止程序。 stacktrace以Finalize()
方法开始,并在类A
上调用,我们在任何地方都不会使用它。
问题
A
的所有实例并识别其起源(创建它们或对其进行引用),或在适当的时机尝试try时调用它们的终结器?特定信息:
完整的堆栈跟踪从帧System.ComponentModel.Component.Finalize()
和System.IO.FileSystemWatcher.Dispose(Boolean disposing)
开始。 FileSystemWatcher
派生自Component
类,因此在FileSystemWatcher
上调用了终结器。
我们在代码中的任何地方都不使用类FileSystemWatcher
。它可能来自某些NuGet,但我们使用了许多。我们的解决方案范围很广,没有任何线索,这可能会导致什么。我们使用在Linux上的dockers中运行的.Net Core 2.2。
记录的异常信息:
AggregateException: One or more errors occurred. (Object reference not set to an instance of an object.);
InnerException: NullReferenceException: Object reference not set to an instance of an object.
Stacktrace:
at System.Threading.CancellationTokenSource.CallbackNode.<>c.<ExecuteCallback>b__10_0(Object s)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
at System.Threading.CancellationTokenSource.ExecuteCallbackHandlers(Boolean throwOnFirstException)
--- End of inner exception stack trace ---
at System.Threading.CancellationTokenSource.ExecuteCallbackHandlers(Boolean throwOnFirstException)
at System.IO.FileSystemWatcher.StopRaisingEvents()
at System.IO.FileSystemWatcher.Dispose(Boolean disposing)
at System.ComponentModel.Component.Finalize()
我认为,唯一的解决方案是将程序分成一些较小的子程序,并分别运行所有子程序以查找有问题的插件。子程序不需要像整个程序那样做有意义的工作。它仅用于测试。