2010-09-21 38 views
16

等同于 “How do exceptions work (behind the scenes) in C++”,但对于C#如何例外在C#中工作(幕后)

我知道在抛出异常时必须执行下面的步骤。

  1. 查找异常类型最接近的处理程序;
  2. 展开堆栈直至处理程序级别;
  3. 调用处理程序;
  4. 查找并致电每个finally块。

如何处理.NET这些操作? “当前”处理程序的映射如何工作?在try/catch块中发出多少代码?并在一个投掷块?

+3

你错过了几个步骤,至少包括:是否有安装任何异常过滤器(他们涉足的前捕获块),并在堆栈展开时执行任何最终块。 – 2010-09-21 14:45:24

+0

的确,我忘了最后的块。让我纠正一下。 – jpbochi 2010-09-21 16:31:50

回答

3

.NET异常使用结构化异常处理实现基本的Windows,虽然这不是一个要求。单声道可能会有所不同。

事实上,如果你写了一个单行控制台应用程序,只是抛出一个异常,然后在WinDbg中运行它,你会看到勾入非托管异常处理。

+0

你能否提供一些关于Mono实现的具体参考,我想了解一下。 – Maniero 2017-10-09 18:56:19

+0

@Maniero我对Mono的实现一无所知。 – 2017-10-09 21:30:04