相关疑难解决方法(0)

CIL的"错误"条款与C#中的"catch"条款有何不同?

根据CLI标准(分区IIA,第19章)和System.Reflection.ExceptionHandlingClauseOptions枚举的MSDN参考页面,有四种不同的异常处理程序块:

  • catch子句:"捕获指定类型的所有对象."
  • filter子句:"仅在过滤器成功时输入处理程序".
  • 最后条款:"处理所有异常和正常退出."
  • fault子句:"处理所有异常,但不能正常退出."

鉴于这些简短的解释(引自CLI标准,顺便说一句),这些应该映射到C#,如下所示:

  • 抓住 -catch (FooException) { … }
  • 过滤器 - 在C#中不可用(但在VB.NET中Catch FooException When booleanExpression)
  • 终于 -finally { … }
  • 错误 -catch { … }

实验:

一个简单的实验表明,这种映射不是.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 …
Run Code Online (Sandbox Code Playgroud)

c# exception-handling system.reflection

17
推荐指数
4
解决办法
2235
查看次数

标签 统计

c# ×1

exception-handling ×1

system.reflection ×1