Java 套接字关闭的嵌套IOException捕获
我使用以下命令写入套接字:Java 套接字关闭的嵌套IOException捕获,java,sockets,exception-handling,ioexception,Java,Sockets,Exception Handling,Ioexception,我使用以下命令写入套接字: OutputStream socketStream = socket.getOutputStream(); socketStream.write(buf); 但这会引发IOException,因此我会: try { OutputStream socketStream = socket.getOutputStream(); socketStream.write(buf); } catch (IOException e) { // logging } fin
OutputStream socketStream = socket.getOutputStream();
socketStream.write(buf);
但这会引发IOException
,因此我会:
try {
OutputStream socketStream = socket.getOutputStream();
socketStream.write(buf);
} catch (IOException e) {
// logging
} finally {
socket.close();
}
socket.close
也会强制我捕获IOException
!所以我需要试试。。。最后在中再次捕获它
IOException
来自close
时,表示套接字未关闭?因此,是否再次尝试关闭?或者怎么办谢谢关闭引发的异常通常可以忽略(您可以记录它)。这与在C++中析构函数中抛出一个异常几乎一样——你可以做的事情不多(通常没有),而且试图关闭它是荒谬的。清理抛出异常通常是糟糕的设计-您可以为清理实现清理代码,但这是一个递归问题,最终您将不得不执行,除非您无法处理它。
close()
抛出IOException
,因为关闭某些东西通常意味着调用flush()
,冲洗可能会失败。例如,如果丢失网络连接并发出socket.close()
,则无法刷新已缓冲的内容,因此flush()
将引发异常。因为数据可能会丢失,所以会检查异常,因此您必须处理这种可能性
我认为最好的解决办法是:
try {
OutputStream socketStream = socket.getOutputStream();
socketStream.write(buf);
socket.close();
} catch (IOException e) {
// try to deal with your I/O error; do logging
} finally {
closeSilently(socket);
}
...
// Somewhere else, usually part of an utility JAR like Apache Commons IO
public static void closeSilently(Socket s) {
if (socket != null) {
try {
socket.close();
} catch (IOException e2) {
// do more logging if appropiate
}
}
}
在常见情况下,此代码将正常工作。如果出现错误(即使在
close()
)内),它将允许您捕获异常并在无条件关闭套接字并吞下它可能抛出的所有内容之前执行某些操作。那么它为什么抛出选中的异常呢?-我不能忽略它,一个未经检查的异常将是一个非常糟糕的主意(这与未经检查的异常是程序员错误的非正式契约相反)。那么,也不例外?当然有可能,但在某些情况下,您希望处理这样一个异常(让它记录下来)。但仅仅因为它抛出了一个异常并不意味着你不能使用一个空的catch块来忽略它。如果传递给close静默的套接字被错误地打开(即连接失败),安全调用关闭了吗?我想不会是空的,应该是安全的。在大多数sane API中,当对象未处于打开状态时,调用close()
是不可操作的。