如何最好地检测某些异常?

时间:2014-02-20 01:37:45

标签: java exception try-catch

首先:StackOverflow告诉我这个问题是主观的,但事实并非如此。

我有这段代码:

try {
    // Some I/O code that should work fine, but might go weird
    // when the programmer fails or other stuff happens...
    // It will also throw exceptions that are completely fine,
    // such as when the socket is closed and we try to read, etc.
} catch (Exception ex) {
    String msg = ex.getMessage();
    if (msg != null) {
        msg = msg.toLowerCase();
    }
    if (msg == null || (!msg.equals("pipe closed") &&
                !msg.equals("end of stream reached") &&
                !msg.equals("stream closed") &&
                !msg.equals("connection reset") &&
                !msg.equals("socket closed"))) {
        // only handle (log etc) exceptions that we did not expect
        onUnusualException(ex);
    }
    throw ex;
}

正如您所看到的,检查某些异常的过程是有效的,但非常脏。我担心一些虚拟机可能会使用其他字符串来处理不应该调用指定方法的异常。

我可以使用哪些不同的解决方案来解决这个问题?如果我使用IOException检查非异常(lol)异常,我将不会捕获任何源自它或使用它的异常异常。

1 个答案:

答案 0 :(得分:2)

对于扩展IOException(或其他异常)的异常,请将其放在单独的catch语句它扩展的异常。

try {
    // this might throw exceptions
} catch (FileNotFoundException e) { // this extends IOException
    // code
} catch (IOException e) {
    // more code
}

在上面的示例中,如果异常是FileNotFoundException的实例,则将执行第一个语句中的代码。第二个只有在{strong> <{1}}的{​​{1}}时才会执行。使用此方法,您可以处理多个相互扩展的异常类型 您还可以在同一IOException语句中捕获多种类型的异常。

FileNotFoundException

希望这有帮助。