我处理异常的想法如下。
当发生未处理的异常时,我想保存具有完整内存的转储,包括发生异常的行可用的局部变量。然后我可以分析该转储并阻止异常再次发生或使用try
... catch
处理它。
我通过简单地处理AppDomain.CurrentDomain.UnhandledException
事件几乎实现了我的目标。每次发生未处理的异常并且其调用堆栈包含异常行时,它都会触发,因此在保存转储后,我需要包含局部变量的所有数据。
但是,该解决方案不适用于TPL。遇到未处理的异常后,任务终止,然后才允许我通过各种方式访问异常(检查Task.Exception
,处理TaskScheduler.UnobservedTaskException
事件,使用TaskContinuationOptions.OnlyOnFaulted
继续,使用{{1} }或Task.Wait()
...)。这些方法显然不允许我在任务中包含局部变量,因为任务本身已经终止。
在这些任务终止之前,我能做些什么来捕捉任务中发生的未处理异常?如果是这样,我可以在这些任务中保存包含局部变量的转储吗?
以下是我提出的解决方案的一些想法:
await
,但是从该事件中我无法检查是否会在AppDomain.CurrentDomain.FirstChanceException
块中处理异常。显然,我不想为稍后将在catch
块中处理的异常保存转储。但是,由于事件看起来只处理一个catch
,理论上我可以运行位于AppDomain
... try
块中的所有代码来自其他catch
。但我不知道如何实现这一点,也不知道它是否真的有用,更不用说可能的缺点了。AppDomain
... try
的替代方法,在遇到异常后不会离开catch
块,从而允许访问局部变量?try
... try
并在catch
块之前声明我的局部变量,但我将该解决方案视为最后的手段,因为它很难看。