部分重叠try-finally块

时间:2014-07-28 07:19:46

标签: c# .net try-catch il

在阅读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:如果他们被允许,是否有正常编程语言的场景,实际生成这种奇怪的代码?

1 个答案:

答案 0 :(得分:3)

根据公共语言基础结构的MS Partition I,第12.4.2.7节无效:

  

每个方法都可以将一组例外条目与之相关联,称为例外集

     

...

     

对于异常集中的每对异常条目,必须满足以下条件之一:

     
      
  • 他们嵌套:一个条目的所有三个区域都应位于另一个条目的单个区域内,   进一步限制封闭区域不应是过滤器。 [注意:从内部调用的函数   过滤器可以包含异常处理。 结束说明]

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

  •   
  • 他们相互保护:受保护的块是相同的,其他区域是pairwisedisjoint。   在这种情况下,所有处理程序应为捕获处理程序或过滤处理程序。优先权   处理程序区域的大小由它们在异常处理程序表(分区II)中的排序决定。

  •   

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