当在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
。我认为SocketException
和FileNotFoundException
与IOException
直接相关的地方,很可能是一个子类,如果我错了,请纠正我。
无论如何,处理这些异常的正确方法是什么,以及如何确定需要处理的异常类型?我所能做的就是处理IOException
,直到出现更精确的内容,但在开发应用程序时,能够唯一地处理每个错误总是好的。
答案 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
}