Ordre d'exception gérant les trames de pile sur la pile d'appels
-
07-07-2019 - |
Question
Quel est l'ordre dans lequel les trames de la pile de traitement des exceptions sont placées dans la pile des appels, par exemple en C #. Si j'ai une méthode:
private void MyMethod() {
try {
DoSomething();
}
catch (Exception ex)
{
//Handle
}
}
Un cadre de pile distinct est-il créé pour chaque gestionnaire d'exceptions comme suit?
DoSomething stackframe<br/>
Exception stackframe<br/>
MyMethod stackframe<br/>
OU
DoSomething stackframe<br />
MyMethod stackframe<br />
Exception stackframe<br />
OU
autre chose?
La solution
Non, l'ajout d'un gestionnaire d'exceptions n'ajoute pas de nouvelle image à la pile d'appels. Il ajoute simplement les informations appropriées pour que, lorsqu'une exception est générée, le framework puisse trouver à chaque niveau de la pile d'appels le gestionnaire approprié pour cette exception (si est-il un gestionnaire approprié).
Cela ressemble un peu à la récupération de place, où le GC peut déterminer, à tout moment de l'exécution, les variables locales qui doivent toujours compter comme racines du GC - une méthode ne se résume en rien au code exécutable lui-même:)