如果我发现错误会发生什么?
What can happen if I catch an error?
令人惊讶的是 google didn't describe any catastrophic scenarios 我扭曲的头脑渴望得到。
在我阅读的任何地方,都不鼓励发现错误。基本规则似乎是,如果您的应用程序产生错误,那么它已经死了,无法保存。因此,如果您在 main
函数中发现错误,您的程序会变成僵尸吗?
如果程序已经崩溃,怎么能连错误都被捕获?捕获错误真的可以做坏事吗?哪些错误最严重,哪些有时会被发现?您能否描述一个可以产生错误的小测试用例(比如真正产生错误,而不仅仅是抛出错误),以便我可以看到如果我捕获并忽略它们,它们会发生什么?
你是说捕捉异常吗?有两种类型的异常检查和未检查。捕获异常的原因与捕获程序员定义的允许用户重新输入数据的异常一样简单。这通常适用于已检查的异常。
无法从中恢复未经检查的异常,您可能会问为什么要捕获它们?也许开发人员想要捕获它以记录导致异常的条件并更好地解决问题。
这是一篇讨论它们的文章。
http://tutorials.jenkov.com/java-exception-handling/checked-or-unchecked-exceptions.html
捕获异常或错误不是一个好主意,除非;
- 你可以用它做一些有用的事情。
- 作为确保正确记录或提交
Runnable
到 ExecutorService 的最后手段。在这种情况下,捕获 Throwable
可能是可取的。
如果您捕获到错误,不会发生任何可怕的事情,但是您也不能假装它没有发生(即您不能继续就好像它无关紧要一样)
注意:不捕获错误对于多线程应用程序来说可能是一件坏事。这是因为未捕获的错误只会关闭当前线程。如果有多个线程,它们将保留 运行 如果至少有一个不是 守护程序 这可能会使程序 运行 但处于错误状态。
I ask what happens.
没什么特别的,你抓到它,你可以处理它或记录它。
除了抛出的物体被捕获外,并没有发生什么。不过,您的过程可能会出现问题,具体取决于导致错误的原因。
A WhosebugError
很难捕获 - 当超过最大堆栈深度时抛出它,并且因为它随后开始弹出调用堆栈,所以它不再是问题(除非您尝试调用有问题的方法再次)。
class SO {
static int Whosebug(){ return Whosebug(); }
public static void main(String... args) {
try {
Whosebug();
} catch (WhosebugError e) {
System.out.println("Oh well, life goes on.");
}
}
}
其他错误,例如 OutOfMemoryError
, are somewhat more problematic - there will still be too much memory used after it's been thrown. Some are directly fatal, like ClassFormatError
,这意味着您正在尝试加载损坏的 class 文件(并且它通常被抛在您无法捕获的地方)。
其他 Error
介于两者之间。例如,AssertionError
在不满足程序员定义的条件(如 assert answer == 42;
)时抛出,但前提是您启用了断言。
长话短说:如果您发现了特定的错误,您可能做错了事(除非您真的知道自己在做什么!)。如果您是 运行 服务器应用程序并希望它保持 运行,您可能最好让当前线程或进程终止并由某种监视器重新启动它。
令人惊讶的是 google didn't describe any catastrophic scenarios 我扭曲的头脑渴望得到。
在我阅读的任何地方,都不鼓励发现错误。基本规则似乎是,如果您的应用程序产生错误,那么它已经死了,无法保存。因此,如果您在 main
函数中发现错误,您的程序会变成僵尸吗?
如果程序已经崩溃,怎么能连错误都被捕获?捕获错误真的可以做坏事吗?哪些错误最严重,哪些有时会被发现?您能否描述一个可以产生错误的小测试用例(比如真正产生错误,而不仅仅是抛出错误),以便我可以看到如果我捕获并忽略它们,它们会发生什么?
你是说捕捉异常吗?有两种类型的异常检查和未检查。捕获异常的原因与捕获程序员定义的允许用户重新输入数据的异常一样简单。这通常适用于已检查的异常。
无法从中恢复未经检查的异常,您可能会问为什么要捕获它们?也许开发人员想要捕获它以记录导致异常的条件并更好地解决问题。
这是一篇讨论它们的文章。
http://tutorials.jenkov.com/java-exception-handling/checked-or-unchecked-exceptions.html
捕获异常或错误不是一个好主意,除非;
- 你可以用它做一些有用的事情。
- 作为确保正确记录或提交
Runnable
到 ExecutorService 的最后手段。在这种情况下,捕获Throwable
可能是可取的。
如果您捕获到错误,不会发生任何可怕的事情,但是您也不能假装它没有发生(即您不能继续就好像它无关紧要一样)
注意:不捕获错误对于多线程应用程序来说可能是一件坏事。这是因为未捕获的错误只会关闭当前线程。如果有多个线程,它们将保留 运行 如果至少有一个不是 守护程序 这可能会使程序 运行 但处于错误状态。
I ask what happens.
没什么特别的,你抓到它,你可以处理它或记录它。
除了抛出的物体被捕获外,并没有发生什么。不过,您的过程可能会出现问题,具体取决于导致错误的原因。
A WhosebugError
很难捕获 - 当超过最大堆栈深度时抛出它,并且因为它随后开始弹出调用堆栈,所以它不再是问题(除非您尝试调用有问题的方法再次)。
class SO {
static int Whosebug(){ return Whosebug(); }
public static void main(String... args) {
try {
Whosebug();
} catch (WhosebugError e) {
System.out.println("Oh well, life goes on.");
}
}
}
其他错误,例如 OutOfMemoryError
, are somewhat more problematic - there will still be too much memory used after it's been thrown. Some are directly fatal, like ClassFormatError
,这意味着您正在尝试加载损坏的 class 文件(并且它通常被抛在您无法捕获的地方)。
其他 Error
介于两者之间。例如,AssertionError
在不满足程序员定义的条件(如 assert answer == 42;
)时抛出,但前提是您启用了断言。
长话短说:如果您发现了特定的错误,您可能做错了事(除非您真的知道自己在做什么!)。如果您是 运行 服务器应用程序并希望它保持 运行,您可能最好让当前线程或进程终止并由某种监视器重新启动它。