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

在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(); } 

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

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

tl; Dr Mutlicatch单独处理事物,多个捕获块更灵活,更灵活。 这两种技术可以结合起来。

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

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

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

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

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

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

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

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

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

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

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

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

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

但是,如果您有一行代码会引发多个exception,并且您希望单独处理这些exception,则单个catchexception将更适合您。

如果你想对所有exception做同样的事情,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常见超类型。

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

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

这将打印所有exception的strack跟踪。 🙂