2009-09-16 132 views
2

在C#中异常处理堆栈帧被压入调用堆栈的顺序是什么。如果我有一个方法:调用堆栈上的异常处理堆栈帧的顺序

private void MyMethod() { 
    try { 
    DoSomething(); 
    } 
    catch (Exception ex) 
    { 
    //Handle 
    } 
} 

是对每个异常处理如下创建一个单独的堆栈帧?

DoSomething stackframe<br/> 
Exception stackframe<br/> 
MyMethod stackframe<br/> 

OR

DoSomething stackframe<br /> 
MyMethod stackframe<br /> 
Exception stackframe<br /> 

OR

别的东西吗?

+1

你更多的方法可以自己尝试。用你想测试的代码创建一个应用程序,然后在调试器中遍历它,在每一步检查调用堆栈。我想对于所有语言来说,一旦它们是MSIL,它都是一样的,但它们可能会因为某些语言构造而发出的MSIL代码有所不同。 – OregonGhost 2009-09-16 09:17:21

回答

1

不,添加异常处理程序不会向调用堆栈添加新框架。它只是添加适当的信息,以便在引发异常时,在调用堆栈的每个级别上,框架都可以找到相应的异常处理程序(如果确实有是合适的处理程序)。

这是一个有点像垃圾收集,在此,执行任意点的GC可以计算出它的局部变量还是应该算作GC根 - 本质上还有比可执行代码本身:)

+0

O.k.所以我误解了一篇维基百科文章。因此,如果DoSomething引发了一个t无法处理的异常,那么调用堆栈会解除展开,并且每个调用堆栈帧都将被检查以获取异常处理程序?对于异常处理程序信息包含在堆栈框架中的方式,有没有特别特别的地方......与本地变量相反呢? – intermension 2009-09-16 09:40:09

+0

@intermension:我不知道我头顶上的细节,但“通过C#的CLR”给出了更多信息,我想。 – 2009-09-16 10:15:50