Ordem de quadros de pilha de manipulação de exceção na pilha de chamadas
-
07-07-2019 - |
Pergunta
O que é a ordem na qual os quadros de pilha de manipulação de exceção são empurrados para a pilha de chamadas em dizer C #. Se eu tenho um método:
private void MyMethod() {
try {
DoSomething();
}
catch (Exception ex)
{
//Handle
}
}
É um quadro de pilha separado criado para cada manipulador de exceção como segue?
DoSomething stackframe<br/>
Exception stackframe<br/>
MyMethod stackframe<br/>
ou
DoSomething stackframe<br />
MyMethod stackframe<br />
Exception stackframe<br />
ou
outra coisa?
Solução
Não, adicionando um manipulador de exceção não adiciona um novo quadro para a pilha de chamadas. Ele só adiciona informação adequada para que, quando uma exceção é lançada, em cada nível da chamada empilhar o quadro pode encontrar o manipulador apropriado para essa exceção (se de fato há é um manipulador apropriado).
É um pouco como a coleta de lixo, onde, em qualquer ponto da execução do GC podem exercitar-se quais variáveis ??locais ainda deve contar como raízes GC - essencialmente há mais de um método que o próprio código executável:)