Inwiefern unterscheiden sich CIL-'Fault'-Klauseln von 'Catch'-Klauseln in C #?

LautCLI-Standard (Partition IIA, Kapitel 19) und die MSDN-Referenzseite für dieSystem.Reflection.ExceptionHandlingClauseOptions enumgibt es vier verschiedene Arten von Ausnahmebehandlungsblöcken:

Fang Klauseln:"Alle Objekte des angegebenen Typs abfangen."Filter Klauseln:Msgstr "Handler nur eingeben, wenn Filter erfolgreich ist."endlich Klauseln:Msgstr "Alle Ausnahmen und normalen Ausgang behandeln."Fehler Klauseln:Msgstr "Behandle alle Ausnahmen, aber nicht den normalen Ausgang."

In Anbetracht dieser kurzen Erläuterungen (im Übrigen aus dem CLI-Standard zitiert) sollten diese wie folgt auf C # abgebildet werden:

Fangcatch (FooException) { … }Filter - nicht verfügbar in C # (aber in VB.NET alsCatch FooException When booleanExpression)endlichfinally { … }Fehlercatch { … }Experiment:

Ein einfaches Experiment zeigt, dass dieses Mapping nicht das ist, was der C # -Compiler von .NET wirklich tut:

// using System.Linq;
// using System.Reflection;

static bool IsCatchWithoutTypeSpecificationEmittedAsFaultClause()
{
    try
    {
        return MethodBase
               .GetCurrentMethod()
               .GetMethodBody()
               .ExceptionHandlingClauses
               .Any(clause => clause.Flags == ExceptionHandlingClauseOptions.Fault);
    }
    catch // <-- this is what the above code is inspecting
    {
        throw;
    }
}

Diese Methode gibt zurückfalse. Das ist,catch { … } wurde nicht als Störungsklausel herausgegeben.

Ein ähnliches Experiment zeigt, dass tatsächlich eine Fangklausel erlassen wurde (clause.Flags == ExceptionHandlingClauseOptions.Clause), obwohl kein Ausnahmetyp angegeben wurde.

Fragen:Obcatch { … } Ist eine catch-Klausel wirklich, wie unterscheiden sich dann die fault-Klauseln von den catch-Klauseln?Gibt der C # -Compiler jemals Fehlerklauseln aus?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage