2009-04-10 3 views
3

Je lisais this article sur la gestion des exceptions d'état corrompu et je suis tombé sur quelque chose qui m'a intrigué.Qu'est-ce qu'une clause d'erreur dans le système d'exception CLR?

Qu'est-ce qu'une clause d'erreur?

devis Voir l'article ci-dessous:

Une condition d'erreur ne peut passer de la fonction contenant la condition inattendue à l'appelant de cette fonction. Les exceptions ont le pouvoir de transmettre les résultats de l'exécution d'une fonction hors du périmètre de la fonction en cours de chaque image la pile jusqu'à ce qu'il atteigne le cadre qui sait gérer la condition inattendue. Le système d'exception du CLR (appelé un système d'exception passe-deux ) offre l'exception à chaque prédécesseur la pile d'appel du fil, en commençant avec l'appelant et procédure jusqu'à ce que une fonction dit qu'il va gérer l'exception (ce qui est connu comme le premier passage ).

Le système va alors se détendre exception l'état de chaque trame sur la pile entre appel lorsque l'exception est soulevée et où il sera traité (connu sous le nom de la seconde passe). Lorsque la pile se déroule, le CLR exécute les clauses finally et les clauses d'erreur dans chaque image lorsqu'elle est déroulée. Ensuite, la clause catch dans la trame de gestion est exécutée .

Répondre

6

Selon this article:

Un autre exemple d'une clause de non SEH disponible dans le langage C# est la clause de défaut. Il est similaire à la clause finally, sauf qu'il n'est invoqué que lorsqu'une exception a été levée dans le bloc protégé.

Another article confirme:

Le gestionnaire d'exception de défaut est similaire au bloc finally sauf qu'il est invoqué que si elle est associée à bloc try est à la suite d'une exception. Après que le gestionnaire d'erreurs a eu la possibilité d'exécuter, l'exception continue son chemin dans la recherche ou un gestionnaire qui est prêt à l'attraper.

2

La clause fault est une clause qui fait partie de l'interface CLI mais n'est pas disponible en C#. Il est très similaire à une clause finally, sauf qu'il n'est invoqué que lorsqu'une exception a été levée dans le bloc try (alors qu'un bloc finally s'exécute, qu'une exception soit levée ou non).