部分重叠的try-finally块

本文关键字:try-finally 重叠 | 更新日期: 2023-09-27 18:15:05

在阅读异常处理子句时,我注意到理论上可以在IL中创建部分重叠的try-finally块。

0000: [code]
0001: [code]
0002: [code]
0003: [code]
0004: endfinally
0005: [code]
0006: endfinally
.try 0000 to 0002 finally handler 0003 to 0005 (1st handler)
.try 0001 to 0003 finally handler 0005 to 0007 (2nd handler)

这意味着如果0000抛出一个异常,第一个处理程序将被击中,如果0001抛出一个异常,两个处理程序都将被击中,如果0002抛出一个异常,只有第二个处理程序将被击中。

也可以定义更奇怪的处理程序,比如:

.try 0003 to 0005 finally handler 0005 to 0007 (3rd handler)

Q1:这些奇怪的处理程序是否被允许,或者是否有规则规定不允许?

Q2:如果允许的话,在正常的编程语言中是否存在这种奇怪的代码实际生成的场景?

部分重叠的try-finally块

这是无效的,根据通用语言基础结构的MS分区I,章节12.4.2.7:

每个方法都可以关联一组异常项,称为异常集

对于异常集中的每一对异常项,下列条件必须有一个为真:

  • They nest:一个条目的所有三个区域应在另一个条目的单个区域内,其中进一步的限制是封闭区域不能是过滤器。[注意:从内部调用的函数过滤器可以包含异常处理。结束注意]

  • 它们不相交:两个表项的所有六个区域都是成对不相交的(没有地址重叠)

  • 它们相互保护:受保护的块是相同的,其他区域是两两不相交的。在这种情况下,所有处理程序都应该是catch处理程序或过滤处理程序。的优先级异常处理程序区域的大小由异常处理程序表(分区II)中的顺序决定。

由于受保护的块既不是嵌套的,也不是不相交的,也不是完全相同的,因此它们不满足这些要求,因此此异常集无效