如果我发现错误会发生什么?

时间:2015-04-16 12:28:14

标签: java error-handling

令人惊讶google didn't describe any catastrophic scenarios我的扭曲的心灵渴望。

我读到的任何地方都不鼓励发现错误。基本规则似乎是,如果您的应用程序产生错误,它已经死了,超出了保存。因此,如果您在main函数中发现错误,您的程序会变成僵尸吗?

如果程序已经崩溃,甚至可以捕获错误?抓错可以做一些真正的坏事吗?哪些错误最差,有时哪些错误?你能描述一个可以产生错误的小测试用例(比如真的产生它们,而不仅仅是抛出它们),这样我就可以看到它们如果我抓住并忽略它们就会这样做吗?

3 个答案:

答案 0 :(得分:3)

捕获异常或错误不是一个好主意,除非;

  • 你可以用它做一些有用的事。
  • 作为最后的手段确保正确记录或在提交的Runnable中记录到ExecutorService。在这种情况下,可能需要捕捉Throwable

如果你遇到一个错误,没有什么可怕的事情会发生,但是你不能假装它也没有发生(也就是说你不能继续,好像它没关系)

注意:不捕获错误对于多线程应用程序来说可能是一件坏事。这是因为未捕获的错误仅关闭当前线程。如果有多个线程,如果至少有一个不是守护程序,它们将继续运行。这可能会使程序运行但处于错误状态。

  

我问发生了什么。

没什么特别的,你抓住了它,你可以处理它或记录它。

答案 1 :(得分:3)

除了捕获抛出的对象外,没有太多事情发生。但是,您的流程可能处于不利的位置,具体取决于导致错误的原因。

一个StackOverflowError非常无法捕捉 - 当超出最大堆栈深度时抛出它,并且因为它随后开始弹出调用堆栈,它不再是一个问题(除非你再次尝试调用有问题的方法)

class SO {
    static int stackOverflow(){ return stackOverflow(); }
    public static void main(String... args) {
        try {
            stackOverflow();
        } catch (StackOverflowError e) {
            System.out.println("Oh well, life goes on.");
        }
    }
}

其他错误,如OutOfMemoryError,有点问题 - 在抛出后仍会有太多内存使用。有些是直接致命的,比如ClassFormatError,这意味着你正在尝试加载一个破坏的类文件(并且它通常被扔在你无法捕获它的地方)。

其他Error介于两者之间。例如,当程序员定义的条件(如assert answer == 42;)不满足时,抛出AssertionError,但前提是你已启用断言。

长话短说但是:如果你正在捕捉特定的错误,你可能做错了(除非你真的知道你在做什么!)。如果您正在运行服务器应用程序并希望它继续运行,那么您可能最好让当前线程或进程死掉并通过某种监视器重新启动它。

答案 2 :(得分:2)

您是在谈论捕获例外吗?选中和取消选中两种类型的例外。捕获异常的原因就像捕获程序员定义的Exception一样简单,它允许用户重新输入数据。这通常适用于已检查的例外。

未经检查的异常无法恢复,您可能会问为什么要抓住它们?也许开发人员希望捕获它以记录导致异常的条件并更好地解决问题。

这是一篇讨论它们的文章。

http://tutorials.jenkov.com/java-exception-handling/checked-or-unchecked-exceptions.html

相关问题