【问题标题】:nested IOException catch for socket close用于套接字关闭的嵌套 IOException 捕获
【发布时间】:2011-09-04 09:05:29
【问题描述】:

我用以下方式写入套接字:

OutputStream socketStream = socket.getOutputStream();
socketStream.write(buf);

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

try {
  OutputStream socketStream = socket.getOutputStream();
  socketStream.write(buf);
} catch (IOException e) {
  // logging
} finally {
  socket.close();
}
  1. 但是socket.close也逼我抓IOException!那么我需要try ... catchfinally 中再次使用它吗?

  2. 当从close 捕获IOException 时,表示套接字没有关闭?所以再试试close?或者怎么办?

谢谢

【问题讨论】:

    标签: java sockets exception-handling ioexception


    【解决方案1】:

    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() 内部),它也会让您在无条件关闭套接字并吞下它可能抛出的所有内容之前捕获异常并执行某些操作。

    【讨论】:

    • 如果传递给 closeSilently 的套接字打开时出现错误(即连接失败),安全调用是否关闭它?我认为它不会为空
    • 应该是安全的。在大多数健全的 API 中,当对象未处于打开状态时,调用 close() 是无操作的。
    【解决方案2】:

    close 抛出的异常通常可以被忽略(你可以记录它)。这与在 C++ 中的析构函数中抛出异常几乎相同 - 您对此无能为力(通常无能为力)并且尝试再次关闭它是荒谬的。清理抛出异常通常是糟糕的设计——你可以为清理实现清理代码,但这是一个递归问题,最后你只需要除了你无法处理它。

    【讨论】:

    • 那么为什么会抛出checked异常呢? - 我不能忽视它
    • 好吧,未经检查的异常将是一个非常糟糕的主意(这违反了未经检查的异常是程序员错误的非正式合同)。那么,也不例外?当然有可能,但在某些情况下您想要处理这样的异常(并让它只是记录它)。但是仅仅因为它抛出一个异常并不意味着你不能使用一个空的catch块来忽略它..
    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2018-04-07
    • 2012-02-08
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多