捕获后,堆栈上仍然存在异常

时间:2016-08-03 08:28:52

标签: c# .net async-await

似乎我偶然发现了一个异常仍然可用于catch块之后的情况。在我遇到它的情况下它是100%可重复的,但是我无法进行完全重现这种情况的测试。

有关调试情况,请参阅此图片:

情况如下:

  1. 正在等待执行ASync任务。
  2. 任务设置为故障状态并抛出异常。
  3. 代码逐步执行catch块,处理异常。 < - 正如预期的那样
  4. catch块完成后,不会从堆栈中清除异常。 < - 不像预期的那样
  5. 最终结果:在catch块之后的所有代码中Marshall.GetExceptionCode()!= 0。

    有没有人知道这里发生了什么?

1 个答案:

答案 0 :(得分:2)

堆栈不属于您,它属于运行时。您的.NET代码不应该依赖于处理堆栈的精确方式。

Marshal.GetExceptionCode专门用于互操作和编译器支持,并且不应该真正用在.NET用户代码中,因为你不知道两行(看似无关紧要)的.NET代码行之间发生了什么。

坚持规范,并停止依赖未定义的行为。它不像.NET中存在大量未定义的行为。