Scala Try/Future,在失败时 Package 异常

bd1hkmkf  于 2023-03-08  发布在  Scala
关注(0)|答案(5)|浏览(130)

假设我有一个方法def doSomething: String,如果出错了,它可以引发一个DoSomethingException
如果我写Try(doSomething),有没有一种简单的方法可以Map异常而不恢复它?
基本上,我希望故障成为由DoSomethingException引起的BusinessException
我知道这样做的代码非常简单,但是没有任何内置的操作符来做吗?这似乎是一个非常常见的操作,但是我在API中找不到任何东西。

7kqas0il

7kqas0il1#

恢复:

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

gijlo24d2#

您可以使用transform

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

hmae6n7t3#

您也可以使用recoverWith

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

brgchamk4#

您还可以匹配Try using PartialFunction(如果没有失败,则展开值):

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

ui7jx7zq5#

警告!

我对OP的理解和其他答案不同!
溶液
既然你说你想要一个"由DoSomethingException引起的BusinessException",为什么不这样做呢?
BusinessException.initCause(DoSomethingException)

结果

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

评论

它仍然需要某种成功和失败的Map(例如,您接受的transform方法),以避免使用恢复。
无论如何,我想把这个放在这里,以防你(或其他人)正在寻找一个真正的"caused by"语义,这就是我在找到你的问题时所寻找的。

相关问题