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:
In Anbetracht dieser kurzen Erläuterungen (im Übrigen aus dem CLI-Standard zitiert) sollten diese wie folgt auf C # abgebildet werden:
Fang —catch (FooException) { … }
Filter - nicht verfügbar in C # (aber in VB.NET alsCatch FooException When booleanExpression
)endlich — finally { … }
Fehler — catch { … }
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.
catch { … }
Ist eine catch-Klausel wirklich, wie unterscheiden sich dann die fault-Klauseln von den catch-Klauseln?Gibt der C # -Compiler jemals Fehlerklauseln aus?