.net 调用堆栈上异常处理堆栈帧的顺序

.net 调用堆栈上异常处理堆栈帧的顺序,.net,exception-handling,callstack,.net,Exception Handling,Callstack,异常处理堆栈帧被推送到调用堆栈(例如C#)的顺序是什么。如果我有一个方法: private void MyMethod() { try { DoSomething(); } catch (Exception ex) { //Handle } } 是否为每个异常处理程序创建一个单独的堆栈框架,如下所示 DoSomething stackframe<br/> Exception stackframe<br/> MyMethod sta

异常处理堆栈帧被推送到调用堆栈(例如C#)的顺序是什么。如果我有一个方法:

private void MyMethod() {
  try {
    DoSomething();  
  }
  catch (Exception ex)
  {
    //Handle
  }
}
是否为每个异常处理程序创建一个单独的堆栈框架,如下所示

DoSomething stackframe<br/>
Exception stackframe<br/>
MyMethod stackframe<br/>
DoSomething stackframe
异常堆栈帧
MyMethod stackframe

DoSomething stackframe
MyMethod stackframe
异常堆栈帧


还有别的吗

否,添加异常处理程序不会向调用堆栈添加新帧。它只是添加了适当的信息,以便在抛出异常时,框架可以在调用堆栈的每个级别找到该异常的适当处理程序(如果确实存在适当的处理程序)


这有点像垃圾收集,在任何执行点,GC都可以计算出哪些局部变量仍应算作GC根-本质上,方法不仅仅是可执行代码本身:)

您可以自己尝试。使用要测试的代码创建一个应用程序,然后在调试器中逐步执行,在每个步骤中检查调用堆栈。我想,一旦它们是MSIL,所有语言都是一样的,但它们可能在为某些语言构造发出的MSIL代码方面有所不同。所以我误读了维基百科的一篇文章。因此,如果DoSomething抛出一个t不处理的异常,调用堆栈将被展开,并且每个调用堆栈帧都将检查一个异常处理程序?异常处理程序信息包含在堆栈框架中的方式是否有什么特别之处。。。与说局部变量相反?@intermension:我不太清楚细节,但我认为“CLR通过C#”提供了更多信息。
DoSomething stackframe<br />
MyMethod stackframe<br />
Exception stackframe<br />