Scala Try/Future,在失败时包装异常

问题描述 投票:0回答:5

假设我有一个方法

def doSomething: String
,如果出现问题,它可以引发
DoSomethingException

如果我写

Try(doSomething)
,有没有一种简单的方法来映射异常而不恢复它?

基本上,我希望失败成为由

BusinessException
引起的
DoSomethingException

我知道这样做的代码很简单,但是没有内置的运算符吗?这似乎是一个很常见的操作,但我在 API 中找不到任何东西。

scala try-catch functor
5个回答
23
投票

随着恢复:

val c = scala.util.Try(doSomething).recover { 
    case e: DoSomethingException => throw new BusinessException
}

14
投票

你可以使用

transform

val t = Failure(new DoSomethingException)
val bt = t.transform(s => Success(s), e => Failure(new BusinessException))

4
投票

您也可以使用

recoverWith

Try {
    doSomething
} recoverWith { 
    case e: DoSomethingException => Failure(new BusinessException)
}

2
投票

您也可以使用 PartialFunction 在 Try 上进行匹配(如果没有失败,则展开值):

Try(doSomething) match {
    case Success(result) => result
    case Failure(throwable) => new BusinessException(throwable)
  }

0
投票

¡警告!

我对 OP 的解释与其他答案不同!

解决方案

既然你说你想要一个由

BusinessException
引起的“
DoSomethingException
”,为什么不这样做呢?

BusinessException.initCause(DoSomethingException)

结果

这最终会输出 两者都是完整的异常(堆栈跟踪和所有)和一个很好的消息,解释第一个是由第二个引起的。

评论

它仍然需要某种成功和失败的映射(例如您接受的

transform
方法)以避免使用恢复。

无论如何,我想把它放在这里以防万一您(或其他人)正在寻找真正的“由”语义引起的。当我发现你的问题时,这就是我要找的东西。

© www.soinside.com 2019 - 2024. All rights reserved.