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:
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
)Wreszcie — finally { … }
wina — catch { … }
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.
catch { … }
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?