在阅读Exception handling clauses时,我注意到理论上可以在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)
问题1:这些奇怪的处理程序是否被允许,或者是否存在其他规则?
Q2:如果他们被允许,是否有正常编程语言的场景,实际生成这种奇怪的代码?
答案 0 :(得分:3)
根据公共语言基础结构的MS Partition I,第12.4.2.7节无效:
每个方法都可以将一组例外条目与之相关联,称为例外集。
...
对于异常集中的每对异常条目,必须满足以下条件之一:
他们嵌套:一个条目的所有三个区域都应位于另一个条目的单个区域内, 进一步限制封闭区域不应是过滤器。 [注意:从内部调用的函数 过滤器可以包含异常处理。 结束说明]
它们不相交:两个条目中的所有六个区域都是成对不相交的(没有地址重叠)。
他们相互保护:受保护的块是相同的,其他区域是pairwisedisjoint。 在这种情况下,所有处理程序应为捕获处理程序或过滤处理程序。优先权 处理程序区域的大小由它们在异常处理程序表(分区II)中的排序决定。
由于受保护的块既不是嵌套的,也不是不相交的,也不完全相同,因此它们不符合这些要求,因此该异常集无效。