在Java中处理相同类型的不同异常?

时间:2015-04-07 20:12:00

标签: java exception exception-handling ioexception

当在Java中处理错误时,看到超类是错误的错误是很常见的,例如

Exception, IOException, SocketException, etc.

但是,你如何找到异常的细节?如何从其他类型中单独输出某个异常类型。例如,我目前正在使用Netty.io处理一个小项目,它会为您可以命名的每种类型的读/写错误抛出IOException。这是有道理的,因为最终这是输入/输出错误,但我将如何单独处理它们。

示例例外:

java.io.IOException: An existing connection was forcibly closed by the remote host
java.io.IOException: Connection reset by peer
java.io.IOException: Stream closed

这个列表还在继续,但是你将如何单独处理这些问题,我在环顾四周时发现了一种看起来非常讨厌的方法如下。

try { 
    // ...
} catch (IOException e) { 
    if(e.getMessage().contains("An existing connection was forcibly closed by the remote host")) {
        // Handle error
    } else //...
}

这似乎非常繁琐,如果你愿意的话,这将是一种更好的方式,correct方式。在过去的几个小时里,我已经查看了相当多的错误处理文章,而且他们都只谈到了常用的大男孩。 IOException, Exception, SocketException, NullPointerException, and FileNotFoundException。我认为SocketExceptionFileNotFoundExceptionIOException直接相关的地方,很可能是一个子类,如果我错了,请纠正我。

无论如何,处理这些异常的正确方法是什么,以及如何确定需要处理的异常类型?我所能做的就是处理IOException,直到出现更精确的内容,但在开发应用程序时,能够唯一地处理每个错误总是好的。

3 个答案:

答案 0 :(得分:2)

在大多数情况下,从代码的角度来看,消息是无关紧要的。它只是向用户显示或记录的东西。唯一突出的事实是,无论出于何种原因,连接都会被破坏,并且根据消息的不同,您可以使用不同的代码路径。

唯一不同的是'socket closed',表示编码错误。

编辑关于您的评论如下:

  • 套接字上除IOException以外的任何SocketTimeoutException对连接都是致命的。
  • 无效的数据包不会导致IOException:这是引发应用层异常的应用层问题,或IOException:的子类,例如java.io.StreamCorruptedException.
  • 没有IOException: connection closed by remote host这样的东西。如果对等方关闭了连接,则会导致流结束条件,该条件表示read()返回-1,readLine()返回null,或readXXX()抛出EOFException对于任何其他X。

答案 1 :(得分:1)

我建议按顺序捕获异常,从最具体到最少 - 这样当您要查找的异常达到时,您会注意到电路中断模式。这是我能想到的最好的:

try {
   /// Something that can result in IOException or a SocketException
catch (IOException e){
   //Do something specific
}catch (SocketExcpetion e){

}catch (Exception e) { //or some superclass of the above exceptions
 ///
}

请勿忘记您还可以使用|命令捕获不同类型的多个异常:catch (IOException|SocketException|

答案 2 :(得分:1)

文档(http://docs.oracle.com/javase/7/docs/api/java/io/IOException.html)包含一长串直接子类。您可能希望查看它们并检查要以不同方式处理的项目。 一旦你知道了,你可以使用多个catch-blocks,首先是子类,然后是最常见的IOException:

catch(SSLException se) {
  // do something
}
catch(HttpRetryException he) {
  // do something else
}
catch(IOException ioe) {
  // nop
}