捕获更常见的异常类型是否好?

时间:2009-05-21 19:34:54

标签: java exception-handling

如果我们要捕捉IOException或其他任何形式的特定形式 事实上,我们只尝试捕捉一对(并为他们定义明确的输出)说

FileNotFoundException
ZipException

我们是否应该始终跟踪并用

覆盖所有基地
catch(IOException e){
    e.printStackTrace();
}

然后可能更进一步捕捉Exception e,或者这是一个 完全浪费时间?

10 个答案:

答案 0 :(得分:9)

通常,您只想捕获并处理可以在较低级别执行某些操作的异常。然后在更高级别,捕获系统范围内任何未处理的异常,以便记录发生的错误。

答案 1 :(得分:4)

通常,您应该只捕获要明确处理的异常。

你不应该捕获Exception,IOException等。 al。,除非你是一个适当的高级别,你正在做你的最后一次捕获,向用户报告一般错误。

答案 2 :(得分:3)

如果有疑问,始终会抓住更具体的例外情况!

答案 3 :(得分:2)

您捕获的异常层次越高,并且没有正确处理它们或重新抛出,您将在地毯下面遇到的问题就越多。您可以拥有难以跟踪的无声错误。

因此,只捕获适当的例外,并让其他人通过。在顶层,如果你不想让你的程序崩溃,你可以拥有一个catch,但至少记录它。这仍然是一个值得怀疑的方法,因为您的应用程序可能处于不一致状态,并且您可能会损坏您的数据。

但是要直接回答你的问题,IOException可能处于适当的水平。它可能足以告诉你,无论问题是什么,它都与IO有关,你可以按照它行事。没有更多信息就很难说。

答案 4 :(得分:1)

像一位好顾问,我说“这取决于。”

通常在Java中,您可以清楚地了解代码中特定点的所有可能异常。看到有人使用

并不罕见
} catch (Exception e){
   // log or stack trace
}

......或多或少的一次性代码。但是,一般情况下,您不应该捕获一个您不知道如何有效处理的异常。 (从不,永远永远,做catch (Exception x) ;,即只是扔掉异常。永远不会。)

控制的是问“我该怎么做?”通常,可以通过询问用户文件的去向来处理文件而不是异常。 zip文件异常更难处理。因此,您可能希望有不同的行为。

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

另外一点建议;不要在“cutomer facing”代码中输出堆栈跟踪 - 非程序员可能看到的代码。非程序员倾向于查看堆栈跟踪和恐慌的完整性。最好将异常转换为“找不到文件'文件名'这样的消息。”并且,如果您真的想要堆栈跟踪,请将日志记录发送到调试级别输出。

答案 5 :(得分:1)

茫然地抓住任何类型的异常并不是一个好主意。是的,作为父母例外,它似乎提供了一层“保护”,但这有几个原因:

检查IOExceptions。如果在代码中没有任何地方可以抛出它,那么添加一个不需要的catch会让事情变得模糊不清,并且可能会让以后查看代码的人感到困惑。

更重要的是,你不会抓住例外,只是让它们消失。如果他们这样做了,你可以将所有方法包装在(catch(Exception e){..})中并完成它。您的异常捕获代码应该是您决定在发生这些错误时该怎么做的地方,例如

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

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:0)

您不应该在可能发生IOException的每个可能位置捕获这些,而是​​在您准备处理剩余IOExceptions和常规异常的调用树中进一步。

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

答案 8 :(得分:0)

我会回应“抓住你能找到的最具体的例外”。

我经常捕获IOException并显示某种“错误读取文件”消息,然后允许用户选择另一个文件或任何合适的文件。如果文件非常糟糕,那么用户可能无法做到这一点,但至少你可以让他们知道文件是坏的。

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

我几乎从未捕捉到“例外”。你打算怎么办呢?你可以做的几乎没有什么可以从“出现问题但没有更多细节可用”中恢复过来。在某些情况下,我认为你至少可以显示错误信息,而不仅仅是死亡,但这就是它。

答案 9 :(得分:0)

这取决于更具体的例外是否有助于解决问题。有时候,就像使用JMX一样,它很好地捕获父异常以避免可能的子异常的长列表。至少Java 7将允许我们每次捕获更多的例外。这将清理代码。