问题描述
按照(分区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
),即使没有异常的类型已经被指定。
问题:
- 如果
赶上{...}
真的是一个catch子句,那么如何从catch子句不同故障的条款? - 请问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#'抓'的条款有什么不同?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!