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

Seb*_*ber 9 java scala exception-handling exception either

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

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


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

我应该返回,而不是自定义Error,java类型ExceptionThrowable我的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 7Validation.fromTryCatch(a: => T)也返回一个Validation[Throwable, T],其中,Validation大致相当于Either.

  • @TravisBrown:NumberFormatException的公平点.但是我使用Either作为异常报告机制的问题是它强制调用者在处理异常或在调用链上传递Either之间进行选择.如果函数的目的非常单一,那么简单地返回一个Option或抛出异常上线在*大多数情况下都是合乎逻辑的.带来downvotes ...... (2认同)