2016-05-26 37 views
1

常见的米姆我使用Scala的精彩Try结构时,看到的是:如果无法从尝试执行得到的返回值抛出异常清洁的方式

Try(canThrowException) match { 
    case Success(result) => result 
    case Failure(e) => throw new Exception("Couldn't do it", e) 
} 

我经常想使这个构造更优雅一点:

Try(canThrowException).getOrElse(throw new Exception("Couldn't do it")) 

这样做会删除我的能力链,是由canThrowException抛出的异常,但看起来更漂亮。

你知道一种既有优雅结构又有异常链接的方法吗?

+0

您可以添加扩展方法; 'def throw():成功[A]','def getOrThrow:A','def throw(f:Throwable => Nothing):成功[A]','def getOrThrow(f:Throwable => Nothing):A '例如。 –

回答

0

尝试recover[U >: T](f: PartialFunction[Throwable, U]): Try[U]

Try(canThrowException) recover { 
    case NonFatal(e) => throw new Exception("Couldn't do it", e) 
} get 

get部分确实难看,但考虑到你刚刚处理了所有的合理的例外,您只剩不合理的(和重新抛出)的。

1

一般来说,可能更好地recoverWith(并留在尝试),而不是实际抛出:

val t = Try(canThrowException) 

t recoverWith { 
    case (e: Throwable) => { Failure(new Exception("Couldn't do it", e)) } 
} 
+0

您的示例都不保留异常链接。第一个例子可以被细微地链接在一起,因为'e'已经在范围之内了,但是我不完全确定如何在第二个例子中链接异常,如果它甚至是可能的。 –