使用Either处理故障 - >堆栈跟踪在哪里?

时间:2012-09-16 19:22:45

标签: java scala exception exception-handling either

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

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


那么我们在实践中做了什么?

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

1 个答案:

答案 0 :(得分:12)

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

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

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

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