异常处理的内部实现

时间:2011-04-19 16:10:43

标签: c# exception exception-handling

今天,当我写一段这样的代码时:

try
{
   ...
}
catch (Exception e)
{
   ...
}

我突然意识到了

catch (Exception e)
{
  ...
}

语句非常类似于函数声明。我依旧记得异常处理涉及某种堆栈行走/操纵。

那么,上面编译成的异常处理代码究竟是什么?我觉得上面的代码只是一种特殊/方便的语法来简化我们的编码,但事实上,也许我们的代码被包装成自动生成的异常处理函数?我希望我能说清楚。

2 个答案:

答案 0 :(得分:10)

幸运的是,CLR架构师Chris Brumme写了一篇关于异常处理如何在CLR中工作的长篇解释。现在,这是八年前写的,今天的一些细节略有不同,但这至少应该给你一个良好的开端。

http://blogs.msdn.com/b/cbrumme/archive/2003/10/01/51524.aspx

答案 1 :(得分:6)

这是一个很好的起点:http://msdn.microsoft.com/en-us/library/5b2yeyab.aspx#how_the_runtime_manages_exceptions

基本上,它们有点像功能,但不是真的。它们本身没有被调用,它们没有单独的堆栈帧(或者单独的堆栈,就此而言),而是使用当前函数的堆栈帧。这就是你可以访问局部变量的原因。

如果要查看它编译的内容,可以使用ILDasm.exe反编译具有异常块的程序集(因此,制作示例程序并对其进行反编译)。或者,使用RedGate的Reflector获得更好的反编译体验。

如果IL不够,您可以通过在Visual Studio中以调试模式运行程序,在方法中设置断点,然后在命中断点时打开生成的程序集,打开反汇编选项卡/窗口调试菜单。

相关问题