是否可以从嵌套的语句跳转到外部“case”语句?

时间:2014-06-05 10:47:39

标签: scala

以下是如何处理意外错误的简单示例:

try {
  // some code that may throw an exception...
} catch {
    case e: MyException => e.errorCode match {
      case Some(ErrorCodes.ERROR_ONE) => println("error 1")
      case Some(ErrorCodes.ERROR_TWO) => println("error 2")
      case _ => println("unhandled error")
      }
    case _ => println("unhandled error")
}

正如您在上面的代码中看到的那样,异常的顶级case和错误代码的嵌套case都以一种 catch all 结尾处理意外错误。代码有效...但我想知道是否有更优雅的方式让我避免重复并只有一个捕获所有语句[即println("unhandled error")]:

try {
  // some code that may throw an exception...
} catch {
    case e: MyException => e.errorCode match {
      case Some(ErrorCodes.ERROR_ONE) => println("error 1")
      case Some(ErrorCodes.ERROR_TWO) => println("error 2")
        // case _ => println("unhandled error")
        // is it possible to jump to the outer *catch all* statement?
      }
    case _ => println("unhandled error")
}

感谢。

1 个答案:

答案 0 :(得分:5)

仅针对少数情况,您可以使用case ... if ...语句来避免嵌套匹配,如下所示:

try {
  errorThrowingCall()
} catch {
  case e: MyException if e.errorCode == Some(ErrorCodes.ERROR_ONE) => println("error 1")
  case e: MyException if e.errorCode == Some(ErrorCodes.ERROR_TWO) => println("error 2")
  case _ => println("unhandled error")
}

或者像@Carsten建议的那样,只需将您的异常转换为案例类:

case class MyException(errorCode : Option[Int]) extends Exception

并在其上进行模式匹配,如下所示:

try {
  errorThrowingCall()
} catch {
  case MyException(Some(ErrorCodes.ERROR_ONE)) => println("error 1")
  case MyException(Some(ErrorCodes.ERROR_TWO)) => println("error 2")
  case _ => println("unhandled error")
}