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