Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 捕获更一般类型的异常是否好?_Java_Exception Handling - Fatal编程技术网

Java 捕获更一般类型的异常是否好?

Java 捕获更一般类型的异常是否好?,java,exception-handling,Java,Exception Handling,如果我们要捕获特定形式的IOException,或任何其他类型的 事实上,我们只是尝试捕捉一对夫妇(并为他们定义最终输出)说 FileNotFoundException ZipException 我们是否应该一直追踪它,并用 catch(IOException e){ e.printStackTrace(); } 然后可能进一步捕获异常e,或者这是一个 完全浪费时间?您捕获的异常层次越高,并且没有正确处理它们,或者重新引用,您将面临的问题就越多。您可能有难以跟踪的无声bug 因此,只捕

如果我们要捕获特定形式的
IOException
,或任何其他类型的 事实上,我们只是尝试捕捉一对夫妇(并为他们定义最终输出)说

FileNotFoundException

ZipException

我们是否应该一直追踪它,并用

catch(IOException e){
    e.printStackTrace();
}
然后可能进一步捕获异常e,或者这是一个
完全浪费时间?

您捕获的异常层次越高,并且没有正确处理它们,或者重新引用,您将面临的问题就越多。您可能有难以跟踪的无声bug

因此,只捕获适当的异常,并让其他异常通过。在顶层,如果您不想使程序崩溃,您可以拥有一个全面的解决方案,但至少要记录它。但这种方法还是有问题的,因为您的应用程序可能处于不一致的状态,并且可能会损坏数据


但要直接回答您的问题,IOException可能处于适当的级别。对你来说,知道问题是什么就足够了,它与IO有关,你可以根据它采取行动。没有更多的信息很难说。

通常,您只想捕获和处理可以在较低级别上处理的异常。然后在更高的层次上,捕获系统范围内所有未处理的异常,这样您就可以记录发生的错误。

就像一个好的顾问一样,我说“这取决于”

一般来说,在Java中,您对代码中某个特定点的所有可能异常都有一个清晰的概念。看到有人使用

} catch (Exception e){
   // log or stack trace
}
。。。在或多或少的一次性代码中。不过,一般来说,您不应该捕获您不知道如何有效处理的异常。(永远不要,永远不要,做
捕捉(异常x);
,即扔掉异常。永远不要。)

控制问题是询问“我能用这个做什么?”通常,可以通过询问用户他的文件去了哪里来处理一个不存在异常的文件。zip文件异常更难处理。因此,您可能希望有单独的行为

另一方面,如果它是一个命令行程序,那么在这两种情况下,您可能只需要一条错误消息


还有一点建议;不要在“面向客户”的代码中输出堆栈跟踪——非程序员可能会看到的代码。非程序员倾向于关注堆栈跟踪的复杂性和恐慌性。最好将异常转换为“找不到文件‘filename’”之类的消息。如果确实需要堆栈跟踪,请使用ose日志将其发送到调试级输出。

通常,您应该只捕获要显式处理的异常


您不应该捕获异常、IOException等。,除非您是一个适当的高级别,您正在进行最后一次捕获,以便向用户报告一般错误。

您不应该在可能发生IOException的每个位置捕获这些异常,而应该在调用树的更高位置,准备处理剩余的IOException和一般异常


我们使用经验法则,即在可以处理错误的位置捕获特定异常,并将剩余异常传递给调用方。

空白捕获任何类型的异常都不是一个好主意。是的,作为一个父级例外,它似乎提供了一层“保护”,但这是不好的,原因如下:

检查异常。如果代码中没有任何地方抛出它,那么添加一个不必要的捕获只会使事情变得模糊,并且很可能会让以后查看代码的人感到困惑

更重要的是,捕捉异常并不是为了让它们消失。如果他们这样做了,您可以将所有方法包装在(catch(Exception e){..})中,然后使用它。您的异常捕获代码应该是您决定在发生这些错误时应该做什么的地方,例如

catch(FileNotFoundException e)
{
 log.error("where's the file?");return null;
}
catch(ZipException e)
{
 log.error("corrupt");return null;
}

关键是要使该方法在所有可能的条件下都表现良好。然后调用方处理文件内容或无内容,而不必担心内容是如何到达那里的

如果有疑问,总是捕获更具体的异常

我将回应“捕获您能捕获的最具体的异常”

我通常捕获IOException并显示某种“读取文件时出错”消息,然后允许用户选择另一个文件或任何合适的文件。如果文件真的很糟糕,用户可能对此无能为力,但至少您可以让他们知道文件很糟糕

如果出现FileNotFoundException,那么真正的问题几乎肯定是用户选择了错误的文件名,或者硬编码的文件名不再有效。我经常为此显示消息


我几乎从来没听过“例外”。你打算怎么办?你几乎无法从“出了问题,但没有进一步的细节”中恢复过来。在某些情况下,我认为您至少可以显示一条错误消息,而不是死掉,但仅此而已。

这取决于是否有更具体的异常有助于故障排除。有时,像JMX一样,捕获父异常以避免可能的子异常的长列表是很好的。至少Java7允许我们在每次捕获时有多个异常。这将大大简化代码。

我认为这是个人喜好的问题。就个人而言,这似乎不是一个好的选择。我更喜欢用try-catch的东西编写对我有意义的代码。这意味着尽可能具体。我想说:

try{
    //Code Here
}
catch(FileNotFoundException e){
    //Code Here
}

不要对此感到刺痛;但是当我看到这一点时,我认为这会在其他地方导致NPE。Re:不一致状态,我相信最终块总是在Java中执行,因为异常会飞上堆栈,而不管异常是否被捕获。因此,即使您小心地不捕获“致命”异常,以避免在