Scala非致命示例

时间:2019-02-20 16:30:00

标签: scala mocking mockito

我正在尝试模拟一种情况,其中我的代码抛出了致命错误,并且在恢复后它还会执行其他操作。像这样:

Try {
// do something
} recover {
  case NonFatal(e) => println("I want to get to this point")
}

我正试图使用​​模拟像when(mock.doMethodThatCallsTry).thenThrow(non-fatal)一样,但是我找不到一个非致命的例子,在浏览了scala文档之后,我可以抛出一个非致命例子来模拟这种情况。

1 个答案:

答案 0 :(得分:0)

NonFatal是Scala的对象,它定义了非致命错误。这是定义

object NonFatal {
/**
* Returns true if the provided `Throwable` is to be considered non-fatal, or false if it is to be considered fatal
*/
    def apply(t: Throwable): Boolean = t match {
    // VirtualMachineError includes OutOfMemoryError and other fatal errors
    case _: VirtualMachineError | _: ThreadDeath | _: InterruptedException | _: LinkageError | _: ControlThrowable => false
             case _ => true
     }
     /**
     * Returns Some(t) if NonFatal(t) == true, otherwise None
     */
     def unapply(t: Throwable): Option[Throwable] = if (apply(t)) Some(t) else None
}

在这种情况下,将捕获所有抛出的异常(致命异常除外)

case NonFatal(e) => println("I want to get to this point")

因为在不适用的非致命异常中,某些是Some(t),而致命的是无。请参阅https://docs.scala-lang.org/tour/extractor-objects.html以供参考。

您可以抛出任何非致命异常。