代码之家  ›  专栏  ›  技术社区  ›  intermension

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

  •  2
  • intermension  · 技术社区  · 15 年前

    异常处理堆栈帧被推送到调用堆栈上的顺序是什么?如果我有方法:

    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 />
    

    还有别的吗?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Jon Skeet    15 年前

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

    这有点像垃圾收集,在执行的任何时候,GC都可以计算出哪些局部变量仍应计为GC根——本质上,对于一个方法来说,除了可执行代码本身之外,还有更多的变量:)