10

我从一些人那里听说,在 Scala 中,我们倾向于(像其他函数式语言一样)不破坏控制流......相反,按照惯例,我们在Either Left.

但是我们如何从那个异常中得到 stracktrace 呢?现在我在左侧返回一个简单的Error案例类,其中包含代码、消息和原因(Error也)。但是,如果我有错误,我无法获得堆栈跟踪。如果我的应用程序变得复杂,可能很难找到返回的代码块Error......根本原因是必不可少的。


那么我们在实践中该怎么做呢?

我应该返回,而不是自定义Error的 java 类型Exception还是Throwable我的Left?在不丢失堆栈跟踪和原因等重要信息的情况下,Scala 异常处理的最佳实践是什么?

4

1 回答 1

12

我建议使用Either[java.lang.Throwable, A]Throwable仍然可以让您访问堆栈跟踪),并且(通常)使您的自定义错误类型扩展java.lang.Exception.

这是Dispatch 0.9使用的做法,例如 whereEither[Throwable, A]用于表示可能失败的计算,自定义错误类型如下所示:

case class StatusCode(code: Int)
  extends Exception("Unexpected response status: %d".format(code))

Scalaz 7Validation.fromTryCatch(a: => T)还返回 a ,Validation[Throwable, T]其中Validation大致相当于Either.

于 2012-09-16T19:57:46.110 回答