在Java中进行错误处理时,是否应该捕获Exception以捕获所有异常或单独捕获异常?

时间:2014-05-25 22:24:09

标签: java exception

假设我的代码抛出许多不同的异常:

thisThrowsIllegalArgumentException("this is an illegal argument");
thisThrowsIOException("C:/Users/Admin/Documents/does-not-exist.txt");
thisThrowsIndexOutOfBoundsException(Integer.MAX_SIZE + 1);
thisThrowsNullPointerException(null);
...etc

需要处理这些错误。所以,我有两个选择。我可以:

单独捕获每个异常,如下所示:

try {
    ...
} catch (IllegalArgumentException ex) {
    System.err.println("Something went wrong.");
} catch (IOException ex) {
    System.err.println("Something went wrong.");
} catch (IndexOutOfBoundsException) {
    System.err.println("Something went wrong.");
} catch (NullPointerException) {
    System.err.println("Something went wrong.");
}

...或者抓住一般Exception,如下:

try {
    ...
} catch (Exception ex) {
    System.err.println("Something went wrong.");
}

据我所知,在Java 7中,您只需编写:

try {
    ...
} catch (IllegalArgumentException | IOException | IndexOutOfBoundsException | NullPointerException ex) {
    System.err.println("Something went wrong.");
}

但是,我受限于Java 6。

最佳做法是什么?

4 个答案:

答案 0 :(得分:6)

一般方法:

  • 如果catch块正在处理问题,则可以捕获最窄的异常类
  • 如果调用者要处理问题,请声明throws。您可能会捕获(仍然是最窄的)并抛出特定于域的异常
  • 如果你无法解决问题,但是没有来电者#34;因为你的代码是调用堆栈中的顶层,所以捕获异常,因为你的代码是最后一次采取行动的机会

答案 1 :(得分:6)

在应用程序代码中捕获Exception通常是错误的。有时它是不可避免的,但如果它是可以避免的,你应该避免它。

请注意:

try {
    ...
} catch (IllegalArgumentException ex) {
    System.err.println("Something went wrong.");
} catch (IOException ex) {
    System.err.println("Something went wrong.");
} catch (IndexOutOfBoundsException) {
    System.err.println("Something went wrong.");
} catch (NullPointerException) {
    System.err.println("Something went wrong.");
}

try {
    ...
} catch (Exception ex) {
    System.err.println("Something went wrong.");
}
做不同的事情!后者捕获所有RuntimeException s(未经检查的异常)以及您希望捕获的已检查异常!要拥有相同的语义,您必须在RuntimeException之前捕获并重新抛出Exception,但是仍然必须显式处理您想要处理的未经检查的异常,如下所示:

try {
    ...
} catch (IllegalArgumentException ex) {
    System.err.println("Something went wrong.");
} catch (IndexOutOfBoundsException) {
    System.err.println("Something went wrong.");
} catch (NullPointerException) {
    System.err.println("Something went wrong.");
} catch (RuntimeException e) { 
    throw e; 
} catch (Exception e) {
    System.err.println("Something went wrong.");
}

哪种方式失败了,你希望代码更紧凑。

您应该编写多异常catch并计划在升级到Java 7时合并catch子句(一个好的IDE将帮助您找到它们并为您转换它们。)

答案 2 :(得分:0)

这总取决于你想做什么。在某些(大多数)情况下,您希望自己处理异常。如果您可以将它们分组,因为您只想打印它们,那么(Exception ex){ex.printStackTrace();}就可以了。

例如,对于写入文件,当它抛出IOException时,你想直接处理它。

您可能想要创建新文件并重新执行该方法等。

..这总取决于你想做什么。

另一个例子:

如果您创建并连接套接字,您可以创建(例外e),也可以自己处理SocketTimeOutException并重新连接套接字。您还可以通过清理您的资源并在某处缓存失败的软件包以便稍后重新发送来捕获IOException并处理正确的断开连接。

答案 3 :(得分:0)

如前所述,这取决于你想做什么以及你的具体情况。

你想要继续执行程序的一些例外,那些你想要特别注意的例子可能是为了给用户一个特定的反馈来请求新的输入或某种变化。< / p>

如果您还不知道如何处理某个异常,则可以捕获常规异常并进行报告。

在某些情况下,例如具有多个方法的类,您可以将每个方法中的所有异常抛出到类中,并处理高一级的异常。