我使用以下代码包装一个布尔函数,并返回它的成功状态:
def wrapper(wrapped: => Boolean) : Boolean = { // this form of prototype takes a function by name
try {
return wrapped
} catch {
case anyException : Throwable =>
log(anyException.toString)
return false }
} 其基本原理是,无论wrapped函数是否未能捕获自己的意外异常并执行相同的操作,wrapper函数都应该返回整体的二进制状态。因此,wrapper通过其布尔返回值传递成功和失败。它也可以是函数结果数据的Option,而不是布尔值。
在Scala中,如何以其他更好的方式实现这一点呢?
我注意到这段代码的一个基本原理(其他几个),无可否认的是,try catch块在流控制块中很麻烦。另一个原因是,我倾向于在我的项目的某个领域中大量使用这种模式。
发布于 2015-02-08 03:47:17
您可以使用Try。虽然它只能捕获NonFata(scala.util.control.NonFatal),但在大多数情况下,这正是您想要的。
import scala.util.Try
def wrapper(predicate: => Boolean) : Boolean = {
Try(predicate) getOrElse false
}或者另一种方式(例如,如果您真的想要捕获任何Throwable)
import scala.util.control.Exception._
def wrapper(predicate: => Boolean) : Boolean = {
catching(classOf[Throwable]) opt predicate getOrElse false
}发布于 2015-02-08 08:36:40
Scala提供了Try特性,该特性就是在这种情况下使用的。
请注意,保留当前的包装器可能会导致几个错误。当您得到一个错误的结果时,您无法知道它是来自应用程序异常还是简单的错误评估。因此,您无法正确处理系统中的任何异常,这可能会导致多个不一致。此外,当你得到一个错误的结果时,你的应用程序的内部状态可能被认为是未知的,这使得你很难看到盒子里的猫是死的还是活的。
为了解决这个问题,scala的Try特性将为您处理这种可能的状态,如果您的谓词有效执行,则返回-in (elem: Boolean),如果在执行过程中抛出异常,则返回失败(例如: Throwable)。然后,您可以使用模式匹配来找出是哪种情况:
import scala.util.{Try, Success, Failure}
[...]
Try(predicate) match {
case Success(bool) => bool
case Failure(ex) => /* Do something to handle ex */
}这以某种方式消除了对包装器的需要,因为您可以保留Try的结果,然后在需要的时候匹配它或获取它的结果。而且,正如在前面的答案中所看到的,有一套相当完整的操作可以用来以一种更时尚的方式处理所有这些情况。
https://stackoverflow.com/questions/28385174
复制相似问题