2

我处理异常的想法如下。

当发生未处理的异常时,我想保存一个带有完整内存的转储,包括发生异常的行中可用的局部变量。然后我可以分析该转储并防止异常再次发生或使用try...处理它catch

AppDomain.CurrentDomain.UnhandledException通过简单地处理事件,我几乎实现了我的目标。每次发生未处理的异常时它都会触发,并且它的调用堆栈包含异常的行,因此在保存转储后,我拥有了我需要的所有数据,包括局部变量。

但是,该解决方案不适用于 TPL。遇到未处理的异常后,任务终止,然后才允许我通过各种方式访问​​异常(检查Task.Exception、处理TaskScheduler.UnobservedTaskException事件、使用延续TaskContinuationOptions.OnlyOnFaulted、使用Task.Wait()await...)。这些方法显然不允许我在任务中包含局部变量,因为任务本身已经终止。

在这些任务终止之前,我可以做些什么来捕获任务中发生的未处理异常?如果是这样,我可以从这些任务中保存包含局部变量的转储吗?

以下是我提出的解决方案的一些想法:

  1. 我可以使用AppDomain.CurrentDomain.FirstChanceException,但在该事件中,我无法检查是否将在catch块中处理异常。显然,我不想为稍后将在一个catch块中处理的某些异常保存转储。但是,由于看起来事件只处理一个AppDomain,理论上我可以运行放置在try...catch块中的所有代码AppDomain。但我不知道如何实现这一目标,也不知道它是否真的有效,更不用说可能的缺点了。
  2. try是否可以在 IL 中编写...的替代方案,在遇到异常后catch不会离开块,从而允许访问局部变量?try
  3. 我可以简单地使用try...catch并在块之前声明我的局部变量try,但我将该解决方案视为最后的手段,因为它很难看。
4

0 回答 0