假设我有一个方法def doSomething: String,如果出错了,它可以引发一个DoSomethingException。如果我写Try(doSomething),有没有一种简单的方法可以Map异常而不恢复它?基本上,我希望故障成为由DoSomethingException引起的BusinessException。我知道这样做的代码非常简单,但是没有任何内置的操作符来做吗?这似乎是一个非常常见的操作,但是我在API中找不到任何东西。
def doSomething: String
DoSomethingException
Try(doSomething)
BusinessException
7kqas0il1#
恢复:
val c = scala.util.Try(doSomething).recover { case e: DoSomethingException => throw new BusinessException }
gijlo24d2#
您可以使用transform
transform
val t = Failure(new DoSomethingException) val bt = t.transform(s => Success(s), e => Failure(new BusinessException))
hmae6n7t3#
您也可以使用recoverWith:
recoverWith
Try { doSomething } recoverWith { case e: DoSomethingException => Failure(new BusinessException) }
brgchamk4#
您还可以匹配Try using PartialFunction(如果没有失败,则展开值):
Try(doSomething) match { case Success(result) => result case Failure(throwable) => new BusinessException(throwable) }
ui7jx7zq5#
我对OP的理解和其他答案不同!溶液既然你说你想要一个"由DoSomethingException引起的BusinessException",为什么不这样做呢?BusinessException.initCause(DoSomethingException)
BusinessException.initCause(DoSomethingException)
这将最终输出 * 两个完整的异常 *(堆栈跟踪和所有)和一个很好的消息,解释第一个是由第二个引起的。
它仍然需要某种成功和失败的Map(例如,您接受的transform方法),以避免使用恢复。无论如何,我想把这个放在这里,以防你(或其他人)正在寻找一个真正的"caused by"语义,这就是我在找到你的问题时所寻找的。
5条答案
按热度按时间7kqas0il1#
恢复:
gijlo24d2#
您可以使用
transform
hmae6n7t3#
您也可以使用
recoverWith
:brgchamk4#
您还可以匹配Try using PartialFunction(如果没有失败,则展开值):
ui7jx7zq5#
警告!
我对OP的理解和其他答案不同!
溶液
既然你说你想要一个"由
DoSomethingException
引起的BusinessException
",为什么不这样做呢?BusinessException.initCause(DoSomethingException)
结果
这将最终输出 * 两个完整的异常 *(堆栈跟踪和所有)和一个很好的消息,解释第一个是由第二个引起的。
评论
它仍然需要某种成功和失败的Map(例如,您接受的
transform
方法),以避免使用恢复。无论如何,我想把这个放在这里,以防你(或其他人)正在寻找一个真正的"caused by"语义,这就是我在找到你的问题时所寻找的。