落入CIL中的catch子句

时间:2017-11-20 13:52:19

标签: c# cil

对于CIL中的try块,我知道您可以通过在受保护块中抛出异常来输入catch处理程序,例如:

try {
     newobj Exception
     throw
     leave EX1
} catch {
     pop
     ldstr "catchblock"
     call WriteLine
} finally {
     ldstr "finallyblock"
     call WriteLine
}

EX1: 

throw语句将控制转移到catch子句中 弹出例外。

我的担忧(/好奇心)是否可以优化这一点,以便执行 不是通过投掷而是通过"下降"通过增加PC进入它。像这样:

try {
     newobj Exception
} catch {
     pop
     ldstr "catchblock"
     call WriteLine
} finally {
     ldstr "finallyblock"
     call WriteLine
}

EX1: 

这是有效的CIL吗?是否可以在不使用throw语句的情况下访问catch处理程序块?

1 个答案:

答案 0 :(得分:1)

不,它明显无效。

在ECMA-335分区I中,第12.4.2.8.1节:

  

只能通过CLI异常系统完成对过滤器或处理程序的输入;也就是说,控制落入这些块是无效的。这意味着过滤器和处理程序不能出现在方法的开头,也不会出现在任何可能导致控制流失的指令之后。