本文介绍了如何CIL'故障'条款从C#'抓'的条款有什么不同?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

按照(分区IIA,第18章)和MSDN对于 System.Reflection.ExceptionHandlingClauseOptions 枚举,有四种不同类型的异常处理模块:




  • 条款:的赶指定类型的所有对象。

  • 过滤器条款:只有当过滤器成功进入处理程序。

  • 最后条款:。处理所有异常和正常退出

  • 故障条款:处理所有异常,但不正常的退出。



鉴于这些简单的解释(从CLI标准的引用,顺便说一句),这些都应该映射到C#如下:




  • — 赶上(FooException){...}

  • 过滤器—在C#中不存在(但在VB.NET为捕捉FooException当booleanExpression

  • 最后— 终于{...}

  • 故障— 赶上{...}



实验:



一个简单的实验表明,这种映射是不是.NET的C#编译器确实:

  //使用System.Linq的; 
//使用的System.Reflection;

静态布尔IsCatchWithoutTypeSpecificationEmittedAsFaultClause()
{

{
返回MethodBase
.GetCurrentMethod()
.GetMethodBody()
.ExceptionHandlingClauses
。任何(第=> clause.Flags == ExceptionHandlingClauseOptions.Fault);
}
捕捉//< - 这就是上面的代码检查
{
扔;
}
}

这方法的返回值。也就是说,赶上{...} 尚未发出的一个错误的条款。



一个类似的实验表明,在事实上,一个catch子句发出( clause.Flags == ExceptionHandlingClauseOptions.Clause ),即使没有异常的类型已经被指定。



问题:




  1. 如果赶上{...} 真的是一个catch子句,那么如何从catch子句不同故障的条款?

  2. 请问C#编译器不断输出故障的条款呢?


解决方案

It's that last line where you went wrong. Read the descriptions again. fault and finally are described practically identically. The difference between them is that finally is always entered, whereas fault is only entered if control leaves the try via an exception. Note that this means that a catch block may have already acted.

If you write this in C#:

try {
    ...
} catch (SpecificException ex) {
    ...
} catch {
    ...
}

Then there is no way that the third block will be entered if control leaves the try via a SpecificException. That's why catch {} isn't a mapping for fault.

这篇关于如何CIL'故障'条款从C#'抓'的条款有什么不同?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-18 20:37