假设我有一个方法
def doSomething: String
,如果出现问题,它可以引发DoSomethingException
。
如果我写
Try(doSomething)
,有没有一种简单的方法来映射异常而不恢复它?
基本上,我希望失败成为由
BusinessException
引起的DoSomethingException
。
我知道这样做的代码很简单,但是没有内置的运算符吗?这似乎是一个很常见的操作,但我在 API 中找不到任何东西。
随着恢复:
val c = scala.util.Try(doSomething).recover {
case e: DoSomethingException => throw new BusinessException
}
你可以使用
transform
val t = Failure(new DoSomethingException)
val bt = t.transform(s => Success(s), e => Failure(new BusinessException))
您也可以使用
recoverWith
:
Try {
doSomething
} recoverWith {
case e: DoSomethingException => Failure(new BusinessException)
}
您也可以使用 PartialFunction 在 Try 上进行匹配(如果没有失败,则展开值):
Try(doSomething) match {
case Success(result) => result
case Failure(throwable) => new BusinessException(throwable)
}
我对 OP 的解释与其他答案不同!
既然你说你想要一个由
BusinessException
引起的“DoSomethingException
”,为什么不这样做呢?
BusinessException.initCause(DoSomethingException)
这最终会输出 两者都是完整的异常(堆栈跟踪和所有)和一个很好的消息,解释第一个是由第二个引起的。
它仍然需要某种成功和失败的映射(例如您接受的
transform
方法)以避免使用恢复。
无论如何,我想把它放在这里以防万一您(或其他人)正在寻找真正的“由”语义引起的。当我发现你的问题时,这就是我要找的东西。