Чем предложения CIL 'fault' отличаются от предложений 'catch' в C #?

СогласноСтандарт CLI (Раздел IIA, глава 19) и справочную страницу MSDN дляSystem.Reflection.ExceptionHandlingClauseOptions enumСуществует четыре вида блоков обработчиков исключений:

catch clauses: "Catch all objects of the specified type." filter clauses: "Enter handler only if filter succeeds." finally clauses: "Handle all exceptions and normal exit." fault clauses: "Handle all exceptions but not normal exit."

Учитывая эти краткие пояснения (цитируемые в стандарте CLI, между прочим), они должны соответствовать C # следующим образом:

catchcatch (FooException) { … } filter — not available in C# (but in VB.NET as Catch FooException When booleanExpression) finallyfinally { … } faultcatch { … } 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), хотя тип исключения не указан.

Questions: If 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?

Ответы на вопрос(5)

Ваш ответ на вопрос