致命错误 VS 异常
Fatal error VS Exception
我知道错误[运行时错误]和异常的区别。{参考JAVA}。
但是致命错误和异常是一回事还是different.Orjava中没有致命错误的概念?
我搜索了 google,但它很混乱。
阅读Java tutorial on Exceptions。
对于简短说明,您可以使用这个小指南。请参阅 class 图表,其中包含 Java 异常层次结构(红色)和每个类别中的一些示例(蓝色)。
Throwable
:任何可以使用 Java 异常机制抛出(和捕获)的事物的共同祖先。
Error
:您可能会将 Error
s 视为所谓的“致命异常”。通常甚至尝试恢复应用程序都没有意义。 OutOfMemoryError
或 WhosebugError
是非常严重的错误,您几乎无法在 应用程序中 执行任何操作。
不抓Error
s,让程序崩溃,在外面解决问题。
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
}
Error
s 和 RuntimeException
s 都是 unchecked,这意味着方法不必声明它抛出它们和调用者不必抓住它们,即没有用 try-catch
块包围调用。
其他异常(继承自Exception
和not自RuntimeException
):异常应该是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."
我知道错误[运行时错误]和异常的区别。{参考JAVA}。 但是致命错误和异常是一回事还是different.Orjava中没有致命错误的概念? 我搜索了 google,但它很混乱。
阅读Java tutorial on Exceptions。
对于简短说明,您可以使用这个小指南。请参阅 class 图表,其中包含 Java 异常层次结构(红色)和每个类别中的一些示例(蓝色)。
Throwable
:任何可以使用 Java 异常机制抛出(和捕获)的事物的共同祖先。
Error
:您可能会将 Error
s 视为所谓的“致命异常”。通常甚至尝试恢复应用程序都没有意义。 OutOfMemoryError
或 WhosebugError
是非常严重的错误,您几乎无法在 应用程序中 执行任何操作。
不抓Error
s,让程序崩溃,在外面解决问题。
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
}
Error
s 和 RuntimeException
s 都是 unchecked,这意味着方法不必声明它抛出它们和调用者不必抓住它们,即没有用 try-catch
块包围调用。
其他异常(继承自Exception
和not自RuntimeException
):异常应该是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."