用于套接字关闭的嵌套 IOException 捕获

zah*_*pov 3 java sockets exception ioexception

我用以下命令写入套接字:

OutputStream socketStream = socket.getOutputStream();
socketStream.write(buf);
Run Code Online (Sandbox Code Playgroud)

但这可能会抛出IOException,所以我这样做:

try {
  OutputStream socketStream = socket.getOutputStream();
  socketStream.write(buf);
} catch (IOException e) {
  // logging
} finally {
  socket.close();
}
Run Code Online (Sandbox Code Playgroud)
  1. socket.close逼我去抓IOException!那么我还需要try ... catch再次使用它吗finally

  2. 当catch IOExceptionfrom时close,这意味着套接字未关闭?那么再试close一次吗?或者该怎么办?

谢谢

gpe*_*che 5

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

该代码在常见情况下可以正常工作。如果出现问题(即使在内部close()),它将允许您捕获异常并在无条件关闭套接字并吞掉它可能抛出的所有内容之前执行某些操作。