2011-04-19 62 views
8

今天,当我写一段代码是这样的:内部实现异常处理

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

我突然意识到,

catch (Exception e) 
{ 
    ... 
} 

说法多么像一个函数声明。我隐约想起异常处理涉及某种堆栈走路/操作。

那么,究竟上面的异常处理代码编译成什么?我有这样的感觉,上面的代码只是一种特殊/方便的语法来简化我们的编码,但事实上,也许我们的代码被封装到一个自动生成的异常处理函数中?我希望我明确自己。

+0

除了提供@siride我相信你想看看文章的资源[微软企业库5.0异常处理块(http://msdn.microsoft.com/en-us/library /ff664698%28v=PandP.50%29.aspx)。该链接上有资源,并且可以下载应用程序块的源代码,以帮助您找到所需的内容。 _note_我**不是**建议您使用代码块批发,而是我相信检查代码和代码的解释将帮助您了解您想知道的内容。 – 2011-04-19 16:32:20

回答

9

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

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

+0

令人印象深刻;我经常遇到一篇博客文章,可以作为一本书的整章。 – 2011-04-19 19:24:14

+0

谢谢Eric,你帮了我很多。 – smwikipedia 2011-04-21 16:24:54

6

这是一个良好的开端:http://msdn.microsoft.com/en-us/library/5b2yeyab.aspx#how_the_runtime_manages_exceptions

基本上,他们是那种喜欢的功能,但不是真的。它们本身并没有被调用,它们没有单独的栈帧(或者单独的栈),而是使用当前函数的栈帧。这就是为什么你可以访问局部变量。

如果你想看看它编译成什么,你可以使用ILDasm.exe来反编译具有异常块的程序集(所以制作一个示例程序并对其进行反编译)。或者,使用RedGate的反射器来获得更好的反编译体验。

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

+0

谢谢,它也有帮助。但我只能标记一个答案。 – smwikipedia 2011-04-21 16:31:02