今天,当我写一段这样的代码时:
try
{
...
}
catch (Exception e)
{
...
}
我突然意识到了
catch (Exception e)
{
...
}
语句非常类似于函数声明。我依旧记得异常处理涉及某种堆栈行走/操纵。
那么,上面编译成的异常处理代码究竟是什么?我觉得上面的代码只是一种特殊/方便的语法来简化我们的编码,但事实上,也许我们的代码被包装成自动生成的异常处理函数?我希望我能说清楚。
答案 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中以调试模式运行程序,在方法中设置断点,然后在命中断点时打开生成的程序集,打开反汇编选项卡/窗口调试菜单。