この記事 では、次のように書かれています:
通常発生する「すべて」をキャッチする場合は、NonFatalを使用します。
import scala.util.control.NonFatal
try {
operation()
} catch {
case NonFatal(e) => errorHandler(e)
}
ただし、通常はException
を使用します。
try {
operation()
} catch {
case e: Exception => errorHandler(e)
}
ScalaのNonFatal
とException
の違いは何ですか? Exception
in Scalaは致命的な例外を含みますか?
Javaの場合、Exception
は致命的ではないエラー用、Error
は致命的エラー用です。 scala= Exception
に関してJavaと異なりますか?
致命的でない例外をキャッチする正しい方法はどれですか?
編集:最新のScalaバージョン(2.11+ではNonFatal.apply
の定義が異なります)に更新されました。
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 {
// 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
}
JVMには特別な「致命的な」種類の例外はありません-Error
sは常に「致命的な」ものではなく、単に特別な種類の内部例外です。 「致命的な」例外は、NonFatal
定義で使用される例外の単なるリストです。この用語では、Exception
を除くすべてのInterruptedException
sは致命的ではないと見なされます。 InterruptedException
が致命的であると考えるのは理にかなっています。スレッドが中断されることを意味するため、それを処理する場合は明示的に行う必要があります。
NonFatal
エクストラクターもControlThrowable
sを正しく処理します。これらは、break
内のbreakable
のような特別な制御伝達関数によってスローされる例外です。
Scalaでは例外についてはあまり言及されていませんが、それでも予期しない障害に対処する際に複数回行われることです。
Java.lang.Errorをキャッチするとき?複数の回答があり、意見がありますが、焦点を合わせましょう共通部分に。
合理的なアプリケーションはキャッチしようとしないでください
NonFatal
は、致命的ではないThrowableのExtractorです。 VirtualMachineError
(たとえば、OutOfMemoryError
およびStackOverflowError
、VirtualMachineError
のサブクラス)、ThreadDeath
、LinkageError
、InterruptedException
、ControlThrowable
、これらは、妥当なアプリケーションがキャッチしようとしてはならない障害の一部です。
これを念頭に置いて、すべての無害なThrowablesをキャッチするコードを作成できます。
try {
// dangerous code
} catch {
case NonFatal(e) => log.error(e, "Something not that bad.")
}
Applyメソッドを見ると、非常にはっきりとわかります。
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
}
}