如何处理不同的失败案例

时间:2015-05-15 08:44:16

标签: scala

我想处理不同的失败案例(以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)
  }
}

如果只有StatsExceptionFileNotFoundException打印消息,则对于所有其他例外,打印堆栈跟踪。

然而ex只是一个Throwable,所以case StatsException是一个没有结果的类型测试(Throwable类型的值也不能是根据IntelliJ的StatsException.type)

更糟糕的是我收到编译错误:java.io.FileNotFoundException is not a value

以惯用方式处理不同失败案例的最佳方式是什么?

2 个答案:

答案 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