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?

Foi útil?

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:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top