对于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处理程序块?
答案 0 :(得分:1)
不,它明显无效。
在ECMA-335分区I中,第12.4.2.8.1节:
只能通过CLI异常系统完成对过滤器或处理程序的输入;也就是说,控制落入这些块是无效的。这意味着过滤器和处理程序不能出现在方法的开头,也不会出现在任何可能导致控制流失的指令之后。