加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中的非生育与异常之间的差异

发布时间:2020-12-16 09:35:22 所属栏目:安全 来源:网络整理
导读:在 this article年,据说: If you want to catch “everything” that would normally happen,then use NonFatal: import scala.util.control.NonFataltry { operation()} catch { case NonFatal(e) = errorHandler(e)} 但是我通常使用异常: try { operati
在 this article年,据说:

If you want to catch “everything” that would normally happen,then use
NonFatal:

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。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读