¿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:
Dadas estas breves explicaciones (citadas de la Norma CLI, por cierto), estas deben asignarse a C # de la siguiente manera:
captura —catch (FooException) { … }
filtrar - no disponible en C # (pero en VB.NET comoCatch FooException When booleanExpression
)finalmente — finally { … }
culpa — catch { … }
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.
catch { … }
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?