Порядок фреймов стека обработки исключений в стеке вызовов

StackOverflow https://stackoverflow.com/questions/1431861

Вопрос

Каков порядок, в котором фреймы стека обработки исключений помещаются в стек вызовов, скажем, в 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 />

или

что-то еще?

Это было полезно?

Решение

Нет, добавление обработчика исключений не добавляет новый фрейм в стек вызовов.Он просто добавляет соответствующую информацию, чтобы при возникновении исключения на каждом уровне стека вызовов платформа могла найти соответствующий обработчик для этого исключения (если оно действительно существует является соответствующий обработчик).

Это немного похоже на сборку мусора, где в любой момент выполнения GC может определить, какие локальные переменные все еще должны считаться корнями GC - по сути, в методе есть нечто большее, чем сам исполняемый код :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top