尝试/多次捕捉与单次捕捉

时间:2013-07-14 00:51:16

标签: java try-catch

在Eclipse中添加try / catch块时,它给了我“Surround with try / multi-catch”或“Surround with try / catch”的选项。

这是try / multi-catch:

try {
    save.load(new FileInputStream(file.getAbsolutePath()));
}
catch (FileNotFoundException | IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

这是单一的try / catch:

try {
    save.load(new FileInputStream(file.getAbsolutePath()));
}
catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

使用其中一种或哪种方式有什么好处/后果?如果我是正确的,第一个示例将在抛出异常的情况下执行catch块并生成SAME CATCH,而第二个示例将在启用单独的catch块时基于异常抛出catch。

还有什么我应该知道的吗?我以前从未使用它们,也不知道它们是否值得使用。

5 个答案:

答案 0 :(得分:7)

tl; dr Mutlicatch单独处理事情,多个catch块更灵活,更易于操作。这两种技术可以结合起来。

如果你有一个可以抛出许多不同异常类型的try语句,你会想要多个catch块。这是更多的代码,但提供了更大的灵活性。

例如,如果使用套接字,SocketException可能只会被重新连接和/或错误消息捕获(因为像无意中断开的电缆那样简单可能会导致这种情况)

如果捕获到空指针异常(虽然未经检查),您将要写入日志并在此处进行紧急着陆,清理可能的内容,并可能以代码方式回溯。 / p>

此外,这可以进一步细分,其中不同类型的“常见”异常可能导致采取不同的操作(例如连接丢失与未解析的名称对第一个连接上的最终用户具有不同的含义尝试)和不同的“重”异常也以不同的方式处理。

虽然您可以拥有一个(多个异常类型)catch块,但它可以单独对所有异常采取类似操作(以与基于拔出电缆的条件相同的方式向用户显示空指针异常)或需要if e instanceof FooException块会降低可读性。

您还可以将两者结合起来,将所有“常见”异常复制到重试和良好消息中,并将所有严重异常转换为强制清除和关闭

您不希望堆栈跟踪用于跳闸电缆,并且您不希望刷掉丢失的物体。

答案 1 :(得分:2)

这是一个选择的事情。您希望平衡可读性,可移植性,可维护性以及以不同方式处理不同的异常。

如此平衡使用...如果你的所有捕获都使用相同的处理块,那么使用第一个表单,因为这只是一个代码块,你不会一遍又一遍地重复自己。编译器可以为您优化一些事情。

另一方面,如果您以不同方式处理每个异常,请使用第二个表单。

这是一个广泛的问题,答案取决于你的目标。

答案 2 :(得分:2)

我相信您的第一个代码段仅适用于您的JDK是Java JDK 7.而第二个代码段仍将在JDK 7及更低版本中运行。

如果你有一行代码可以抛出不同类型的异常并且你想以类似的方式处理它们,那么Multicatch将适合你,因为它可以保存几行代码。

但是,如果您有一行代码会抛出几个异常,并且您希望单独处理这些异常,那么单个catch异常将更适合您。

答案 3 :(得分:1)

如果你想对所有异常做同样的事情,try-multi catch和try-catch是相同的,除了前者更短。 所有程序员都很懒惰。

当你想为不同的例外做不同的事情时:

} catch(AException e) {
    System.err.println("AException occured");
} catch(BException e) {
    System.err.println("BException occured");
}

Try-multi catch不是正确的选择。


} catch(AException | BException e) {
    System.err.println("A or B Exception occured");
}

请注意,e的类型是AExceptionBException最近的常见超类型。

答案 4 :(得分:0)

看,try-catch结构的实际实用程序是您可以将特定的错误处理函数应用于特定的异常。在您的情况下,除了要打印的堆栈跟踪之外,您似乎不希望发生任何事情。例如,如果我想要在抛出FileIOException时关闭窗口,并且我只想在出现任何其他异常时出现错误消息,那么在第二个中写入多个try-catch块会很有用代码块。但是,在这个应用程序中,你可能只想得到这样一个问题:

try {
    save.load(new FileInputStream(file.getAbsolutePath()));
} catch (Exception e) {
    e.printStackTrace();
}

这将打印所有异常的strack跟踪。 :)