如何在Scala中一次捕获多个异常?有没有比C#中更好的方法:一次捕获多个异常?
Answers:
您可以将整个模式绑定到这样的变量:
try {
throw new java.io.IOException("no such file")
} catch {
// prints out "java.io.IOException: no such file"
case e @ (_ : RuntimeException | _ : java.io.IOException) => println(e)
}
参见Scala语言规范第118页第8.1.11段,称为模式替代。
观看“模式匹配发布”,深入了解Scala中的模式匹配。
由于可以在catch子句中使用scala的完整模式匹配功能,因此您可以执行以下操作:
try {
throw new IOException("no such file")
} catch {
case _ : SQLException | _ : IOException => println("Resource failure")
case e => println("Other failure");
}
请注意,如果您需要一次又一次编写相同的处理程序,则可以为此创建自己的控制结构:
def onFilesAndDb(code: => Unit) {
try {
code
} catch {
your handling code
}
}
对象scala.util.control.Exceptions中提供了一些此类方法。失败,failAsValue,处理可能正是您需要的
编辑:与下面所说的相反,可以绑定替代模式,因此所提出的解决方案不必要地复杂。请参阅@agilesteel解决方案
不幸的是,使用此解决方案,您无法使用其他模式访问异常。据我所知,您不能使用case绑定其他模式e @ (_ : SqlException | _ : IOException)
。因此,如果需要访问异常,则必须嵌套匹配器:
try {
throw new RuntimeException("be careful")
} catch {
case e : RuntimeException => e match {
case _ : NullPointerException | _ : IllegalArgumentException =>
println("Basic exception " + e)
case a: IndexOutOfBoundsException =>
println("Arrray access " + a)
case _ => println("Less common exception " + e)
}
case _ => println("Not a runtime exception")
}
您也可以使用scala.util.control.Exception
:
import scala.util.control.Exception._
import java.io.IOException
handling(classOf[RuntimeException], classOf[IOException]) by println apply {
throw new IOException("foo")
}
这个特定的示例可能不是说明如何使用它的最佳示例,但是我发现它在许多情况下非常有用。
这对我来说是唯一的方法,它通过了低谷sbt clean coverage test coverageReport
而又没有引发讨厌的解析异常……
try {
throw new CustomValidationException1(
CustomErrorCodeEnum.STUDIP_FAIL,
"could be throw new CustomValidationException2")
} catch {
case e
if (e.isInstanceOf[CustomValidationException1] || e
.isInstanceOf[CustomValidationException2]) => {
// run a common handling for the both custom exceptions
println(e.getMessage)
println(e.errorCode.toString) // an example of common behaviour
}
case e: Exception => {
println("Unknown error occurred while reading files!!!")
println(e.getMessage)
// obs not errorCode available ...
}
}
// ...
class CustomValidationException1(val errorCode: CustomErrorCodeEnum, val message: String)
class CustomValidationException2(val errorCode: CustomErrorCodeEnum, val message: String)
sbt clean coverage test coverageReport
在撰写本文时,它不会通过... github.com/scoverage/sbt-scoverage/issues/257