致命错误 VS 异常

Fatal error VS Exception

我知道错误[运行时错误]和异常的区别。{参考JAVA}。 但是致命错误和异常是一回事还是different.Orjava中没有致命错误的概念? 我搜索了 google,但它很混乱。

阅读Java tutorial on Exceptions

对于简短说明,您可以使用这个小指南。请参阅 class 图表,其中包含 Java 异常层次结构(红色)和每个类别中的一些示例(蓝色)。

Throwable:任何可以使用 Java 异常机制抛出(和捕获)的事物的共同祖先。

Error:您可能会将 Errors 视为所谓的“致命异常”。通常甚至尝试恢复应用程序都没有意义。 OutOfMemoryErrorWhosebugError 是非常严重的错误,您几乎无法在 应用程序中 执行任何操作。

不抓Errors,让程序崩溃,在外面解决问题。

RuntimeException:应该主要用于程序员的错误(见下例),例如未处理空指针取消引用,不履行方法合同等

虽然它们是将所有异常包装到 RuntimeException 中并在业务代码之外处理的技术(通常使用 AOP),但通常 RuntimeException 的出现意味着您应该让程序崩溃并修复其源代码。

/**
 * Does something with s.
 * @param s The input string
 */
public void badlyDesignedMethod(String s) {
    // Here the programmer omitted to check s against null
    int i = s.length();
    ...
}

/**
 * Does something with s.
 * @param s The input string; must not be null
 */
public void betterDesignedMethod(String s) {
    if (s == null) {
        throw new IllegalArgumentException("The parameter s must not be null!");
    }
    int i = s.length();
    ...
}

public void caller() {
    badlyDesignedMethod(null); // will throw NullPointerException
    // It is the fault of the programmer of badlyDesignedMethod()
    // as they have not specified that the parameter must not be null.

    betterDesignedMethod(null); // will throw IllegalArgumentException
    // Now it is the fault of the programmer of caller()
    // as they violated the contract of betterDesignedMethod()
    // which DOES tell them that the parameter must not be null
}

Errors 和 RuntimeExceptions 都是 unchecked,这意味着方法不必声明它抛出它们和调用者不必抓住它们,即没有用 try-catch 块包围调用。

其他异常(继承自ExceptionnotRuntimeException):异常应该是declared (throws...) 和 caught (try-catch),它们主要用于将有用的信息从方法传递给调用者: 数据库不可用,文件无法打开等

这些是应该由您的代码处理的异常。它们是“预期的异常”,与 运行 时间的异常相比是“意外的异常”。

public void doSomethingWithFile(String fileName) throws IOException {
    if (/* file is not accessible */) {
        throw new IOException("File " + fileName + " is not accessible!");
    }
    ...
}
public void caller() {
    try {
        doSomethingWithFile("/home/honza/file.txt");
    }
    catch (IOException e) {
        // handle the fact that the file is not accessible
        return;
    }
    ...
}

FATAL 这个词通常用于记录器框架的上下文中,例如log4j、SLF4J、logback 等等。现在查看日志文件可以找到类似

的消息
2015-09-28 15:21:48,222 Thread-4 FATAL Unable to register shutdown hook because JVM is shutting down. java.lang.IllegalStateException: Cannot add new shutdown hook as this is not started. Current state: STOPPED
at org.apache.logging.log4j.core.util.DefaultShutdownCallbackRegistry.addShutdownCallback(DefaultShutdownCallbackRegistry.java:113)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.addShutdownCallback(Log4jContextFactory.java:271)
at org.apache.logging.log4j.core.LoggerContext.setUpShutdownHook(LoggerContext.java:240)     

这表示操作导致了错误或异常的发生,并且错误或异常是由开发人员使用记录器框架在 FATAL 级别记录的。该消息可能已在任何级别记录。

Log4J 例如提供许多日志级别:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL

http://logging.apache.org/log4j/2.x/log4j-api/apidocs/org/apache/logging/log4j/Level.html

为了引起更多混淆,有一个名为 ERROR 的日志级别。

总而言之,致命异常与致命错误: FATAL 是记录异常或错误对象的日志级别,与发生的异常或错误无关,但是当开发人员以 FATAL 级别登录时,它会引起您的注意并引起反应。

根据 Log4J 关于何时以 FATAL 级别登录的文档 "A severe error that will prevent the application from continuing."