代码之家  ›  专栏  ›  技术社区  ›  Nick

陷入CIL中的catch子句

  •  0
  • Nick  · 技术社区  · 8 年前

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

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

    throw语句将控制转移到catch子句,catch子句 弹出异常。

    我担心(/好奇)这是否可以优化,以便执行 不是通过投掷,而是通过PC的增量“落入”捕捉挡块。如下所示:

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

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Brian Reichle    8 年前

    不,它显式无效。

    在ECMA-335第一部分第12.4.2.8.1节中:

    只能通过CLI异常系统进入过滤器或处理程序;也就是说,控制落入此类块中是无效的。这意味着过滤器和处理程序不能出现在方法的开头,也不能紧跟在任何可能导致控制流崩溃的指令之后。