¿En qué se diferencian las cláusulas de "falla" de CIL de las cláusulas de "captura" en C #?

De acuerdo con laCLI estándar (Partición IIA, capítulo 19) y la página de referencia de MSDN para laSystem.Reflection.ExceptionHandlingClauseOptions enumerar, hay cuatro tipos diferentes de bloques de control de excepciones:

captura cláusulas"Atrapa todos los objetos del tipo especificado".filtrar cláusulas"Introduzca el controlador solo si el filtro tiene éxito".finalmente cláusulas"Manejar todas las excepciones y la salida normal".culpa cláusulas"Manejar todas las excepciones pero no la salida normal".

Dadas estas breves explicaciones (citadas de la Norma CLI, por cierto), estas deben asignarse a C # de la siguiente manera:

capturacatch (FooException) { … }filtrar - no disponible en C # (pero en VB.NET comoCatch FooException When booleanExpression)finalmentefinally { … }culpacatch { … }Experimentar:

Un experimento simple muestra que esta asignación no es lo que realmente hace el compilador de C # de .NET:

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

Este método devuelvefalse. Es decir,catch { … } No se ha emitido como una cláusula de fallo.

Un experimento similar muestra que, de hecho, se emitió una cláusula catch (clause.Flags == ExceptionHandlingClauseOptions.Clause), aunque no se haya especificado ningún tipo de excepción.

Preguntas:Sicatch { … } realmente es una cláusula catch, entonces, ¿en qué se diferencian las cláusulas de fallo de las cláusulas catch?¿El compilador de C # alguna vez emite cláusulas de falla?

Respuestas a la pregunta(5)

Su respuesta a la pregunta