【问题标题】:Order of exception handling stack frames on the call stack调用堆栈上的异常处理堆栈帧的顺序
【发布时间】:2010-11-28 17:54:59
【问题描述】:

在 C# 中,异常处理堆栈帧被推送到调用堆栈的顺序是什么。如果我有方法:

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

是否为每个异常处理程序创建了一个单独的堆栈帧,如下所示?

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

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

还有什么?

【问题讨论】:

  • 你可以自己试试这个。使用您要测试的代码创建一个应用程序,然后在调试器中单步执行它,检查每一步的调用堆栈。我想一旦它们是 MSIL,所有语言都是一样的,但是它们为某些语言结构发出的 MSIL 代码可能会有所不同。

标签: .net exception-handling callstack


【解决方案1】:

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

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

【讨论】:

  • 好的。所以我误读了一篇维基百科的文章。因此,如果 DoSomething 抛出了一个 t 无法处理的异常,调用堆栈将被展开,并且每个调用堆栈帧都会检查一个异常处理程序?异常处理程序信息包含在堆栈帧中的方式有​​什么特别的地方......而不是说局部变量?
  • @intermension:我不知道我脑海中的细节,但我认为“CLR via C#”提供了更多信息。
猜你喜欢
  • 2013-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 2017-05-08
相关资源
最近更新 更多