当socket.close()抛出Java时我能做些什么?

时间:2011-08-10 13:31:56

标签: java multithreading sockets exception

一周前开始学习java,并决定学习使用异常的正确方法。 Java真的让我很生气,因为它指定了方法可以作为其签名的一部分抛出的异常。

我目前正在尝试为客户端 - 服务器应用程序实现多线程服务器。我对socket.close()可以抛出IOException这一事实感到非常惊讶。问题是,如果它发生了我该怎么办?

...
final Socket socket = .... // at this point I know that I have a good socket
try {
  ..... // communicating with someone on that side....
} catch(IOException e) {
  // communication failed
  // this fact is useful, I can log it
  // and will just hang up
} finally {
  try {
    socket.close(); // bye-bye
  } catch(IOException e) {
    // anything but logging I can do here?
  }
}
...

这段代码在一个单独的线程中执行,所以我只是必须捕获所有异常。问题主要是心理问题 - 我知道,我可以将catch块留空,但我试图避免这种伎俩。

有什么想法吗?

6 个答案:

答案 0 :(得分:13)

当关闭资源失败时,你不做任何重大事情是很常见的。记录可能是一个好主意,因此您有机会发现它是否经常发生。

如果关闭资源也是“提交”或以某种其他方式持续更改,则会有所不同:那么您需要像处理任何其他部分中的异常一样对待它:处理它。

请注意,Java 7专门引入了automatic resource management来简化这些类型的构造。如果你现在学习Java,那么我建议你选择最新的和最好的。

答案 1 :(得分:3)

我想这取决于您是从套接字读取数据还是向其写入数据。如果您读取数据并检索了所需的所有信息,则可以安全地忽略该异常。但是如果你写了数据,你可能不得不假设它没有正确传输。

答案 2 :(得分:3)

Apache Commons IO(一个我不能不写Java的库)为此目的有一个方法IOUtils.closeQuietly()

所以你可以这样做:

final Socket socket = .... // at this point I know that I have a good socket
try {
  ..... // communicating with someone on that side....
} catch(IOException e) {
  // communication failed
  // this fact is useful, I can log it
  // and will just hang up
} finally {
  IOUtils.closeQuietly(socket);
}

并保存5行代码。

作为奖励,如果套接字为空或已经关闭,closeQuietly()做正确的事情。其他任何事情都有重载Closeable

答案 3 :(得分:1)

正如评论中所说,你可以做的并不多。我建议你记录一个错误,如果曾经发生这种情况,你至少有一个地方可以开始寻找。

答案 4 :(得分:1)

这引起了很多人的注意,强制要抓住这样的嵌套异常。

你应该记录它,理想情况下使用像Log4J这样强大的东西,但除此之外我会说忽略它是安全的,除了评论说“刻意忽略”。

答案 5 :(得分:1)

除了捕获并记录它之外,没有什么可以对close抛出的异常做什么。重要的是,如果你要抛出它,并且如果在达到close方法之前抛出了另一个异常,则close方法可能抛出一个掩盖第一个异常的异常,它不会出现在任何地方你都不知道真正的问题是什么。所以你绝对不希望这样。