IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    scala雾中风景(24): break与异常捕获

    hongjiang发表于 2015-09-03 15:15:21
    love 0

    这段代码如果把异常捕获部分的Exception替换为Throwable会有什么不同?

    import scala.util.control.Breaks.break
    import scala.util.control.Breaks.breakable
    
    object Main {
    
      @throws(classOf[Exception])
      def prepare() = false
    
      def main(args:Array[String]) {
        var i = 0
    
        while(i < 3) {
          breakable {
    
            try{
              i+=1
              if(!prepare()) break
              println("do something here")
            }catch {
              //case e: Throwable => e.printStackTrace
              case e: Exception => e.printStackTrace
            }
    
            println("done")
          }
        }
    
      }
    }
    

    问题的关键在于scala里的break是通过异常机制实现的流控,与java里完全不同。break是抛出了一个BreakControl的异常,也是从Throwable接口继承下来的。所以当应用在捕获异常时,try代码块里有break流控语句,需要注意对流控异常不要干预,如果这种情况下真要捕获Throwable的话,正确的方式是:

    try{
        if (...) break
        ...
    
    }catch {
        case e0: ControlThrowable => throw e0 // 不要干预流控的异常
        case e1: Throwable => e1.printStackTrace
    }
    


沪ICP备19023445号-2号
友情链接