Czym różnią się klauzule CIL 'fault' od klauzul 'catch' w C #?

WedługStandard CLI (Partycja IIA, rozdział 19) i strona odniesienia MSDN dlaSystem.Reflection.ExceptionHandlingClauseOptions enum, istnieją cztery różne rodzaje bloków obsługi wyjątków:

łapać klauzule:„Złap wszystkie obiekty określonego typu”.filtr klauzule:„Wprowadź obsługę tylko wtedy, gdy filtr się powiedzie”.Wreszcie klauzule:„Obsługuj wszystkie wyjątki i normalne wyjście”.wina klauzule:„Obsługuj wszystkie wyjątki, ale nie normalne wyjście”.

Biorąc pod uwagę te krótkie wyjaśnienia (cytowane ze standardu CLI, btw.), Powinny one być odwzorowane na C # w następujący sposób:

łapaćcatch (FooException) { … }filtr - niedostępne w C # (ale w VB.NET jakoCatch FooException When booleanExpression)Wreszciefinally { … }winacatch { … }Eksperyment:

Prosty eksperyment pokazuje, że to mapowanie nie jest tym, co naprawdę robi kompilator .NET C #:

// 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;
    }
}

Ta metoda powracafalse. To jest,catch { … } nie został wyemitowany jako klauzula błędu.

Podobny eksperyment pokazuje, że w rzeczywistości została wydana klauzula połowowa (clause.Flags == ExceptionHandlingClauseOptions.Clause), mimo że nie określono żadnego typu wyjątku.

Pytania:Jeślicatch { … } naprawdę jest klauzulą ​​catch, a jak różnią się klauzule błędów od klauzul catch?Czy kompilator C # w ogóle generuje klauzule błędów?

questionAnswers(5)

yourAnswerToTheQuestion