Чем предложения CIL 'fault' отличаются от предложений 'catch' в C #?
СогласноСтандарт CLI (Раздел IIA, глава 19) и справочную страницу MSDN дляSystem.Reflection.ExceptionHandlingClauseOptions
enumСуществует четыре вида блоков обработчиков исключений:
Учитывая эти краткие пояснения (цитируемые в стандарте CLI, между прочим), они должны соответствовать C # следующим образом:
catch —catch (FooException) { … }
filter — not available in C# (but in VB.NET as Catch FooException When booleanExpression
)
finally — finally { … }
fault — catch { … }
Experiment:
Простой эксперимент показывает, что это сопоставление не то, что на самом деле делает компилятор .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;
}
}
Этот метод возвращаетfalse
, То есть,catch { … }
не был выпущен как пункт о неисправности.
Подобный эксперимент показывает, что на самом деле была выдана оговорка об улове (clause.Flags == ExceptionHandlingClauseOptions.Clause
), хотя тип исключения не указан.
catch { … }
really is a catch clause, then how are fault clauses different from catch clauses?
Does the C# compiler ever output fault clauses at all?