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