我想处理不同的失败案例(以Try身份返回)。
示例代码
main(args(0)) match {
case Success(result) => result.foreach(println)
case Failure(ex) => ex match {
case FileNotFoundException =>
System.err.println(ex.getMessage)
case StatsException =>
System.err.println(ex.getMessage)
case _ => {
ex.printStackTrace()
}
System.exit(1)
}
}
如果只有StatsException
或FileNotFoundException
打印消息,则对于所有其他例外,打印堆栈跟踪。
然而ex只是一个Throwable,所以case StatsException
是一个没有结果的类型测试(Throwable类型的值也不能是根据IntelliJ的StatsException.type)
更糟糕的是我收到编译错误:java.io.FileNotFoundException is not a value
以惯用方式处理不同失败案例的最佳方式是什么?
答案 0 :(得分:2)
这似乎有效:
main(args(0)) match {
case Success(result) => result.foreach(println)
case Failure(ex: FileNotFoundException) =>
System.err.println(ex.getMessage)
System.exit(1)
case Failure(ex: StatsException) =>
System.err.println(ex.getMessage)
System.exit(1)
case Failure(ex) =>
ex.printStackTrace()
System.exit(1)
}
让所有失败案例共享System.exit(1)调用会很好。
答案 1 :(得分:2)
我会简化你自己的答案:
main(args(0)) map (_ foreach println) recover {
case ex@(_: FileNotFoundException | _: StatsException) =>
System.err.println(ex.getMessage)
System.exit(1)
case ex =>
ex.printStackTrace()
System.exit(1)
}
在第一个case
条款中,我们匹配两个替代方案。
scala禁止case ex: FileNotFoundException | ex: StatsException
之类的声明,但我们可以通过@
符号分配整个匹配结果。有关详细信息,请参阅this question