Scala中的非生育与异常之间的差异
在
this article年,据说:
import scala.util.control.NonFatal try { operation() } catch { case NonFatal(e) => errorHandler(e) } 但是我通常使用异常: try { operation() } catch { case e: Exception => errorHandler(e) } 我想知道Scala中的NotFatal和Exception之间有什么区别? Scala中的异常是否包括致命异常? AFAIK在java中,异常是非致命错误,错误是致命的错误。例外情况下,scala是否与java不同? 正确的方法是捕获非致命异常? 解决方法
NonFatal只是一个方便的提取器,它在scala.util.control中定义:
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 { case _: StackOverflowError => true // StackOverflowError ok even though it is a VirtualMachineError // VirtualMachineError includes OutOfMemoryError and other fatal errors case _: VirtualMachineError | _: ThreadDeath | _: InterruptedException | _: LinkageError | _: ControlThrowable | _: NotImplementedError => 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 } 在JVM上没有特殊的“致命”异常 – 错误并不总是“致命的”,它们只是一种特殊的内部异常。 “致命”异常只是NonFatal定义中使用的异常列表。在这个术语中,除了InterruptedException之外的所有异常都被认为是非致命的。考虑InterruptedException是致命的,因为这意味着线程被中断,所以如果你想处理它,你应该明确地做。 NonFatal提取器也正确处理ControlThrowables。这些是由特殊的控制传递函数抛出的例外,如break in breakable。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |