Seb*_*ber 9 java scala exception-handling exception either
我从一些人那里听说,在Scala中,我们倾向于(像其他函数式语言一样)不打破控制流...相反,按惯例,我们返回错误Either Left.
但是我们如何从这个例外中得到stracktrace呢?现在我在左边返回一个Error带有代码,消息和原因的简单案例类(Error也是).但如果我有错误,我无法获得堆栈跟踪.如果我的应用程序变得复杂,可能很难找到返回的代码块Error......根本原因是必不可少的.
那么我们在实践中做了什么?
我应该返回,而不是自定义Error,java类型Exception或Throwable我的Left?在不丢失堆栈跟踪和原因等重要信息的情况下,Scala异常处理的最佳实践是什么?
Tra*_*own 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))
Run Code Online (Sandbox Code Playgroud)
Scalaz 7的Validation.fromTryCatch(a: => T)也返回一个Validation[Throwable, T],其中,Validation大致相当于Either.