gpt4 book ai didi

scala - 是否可以从嵌套语句跳转到外部 "case"语句?

转载 作者:行者123 更新时间:2023-12-01 16:43:41 25 4
gpt4 key购买 nike

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

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 以处理意外错误。该代码有效...但我想知道是否有一种更优雅的方法可以让我避免重复并且只有一个catch all语句[即println("未处理的错误")]:

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")
}

谢谢。

最佳答案

对于少数情况,您可以使用 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")
}

关于scala - 是否可以从嵌套语句跳转到外部 "case"语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24058169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com