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

2022-09-04 08:36:00

一周前开始学习Java,并决定学习正确的例外工作方式。Java真的让我发疯,因为指定该方法可以作为其签名的一部分可以引发的异常。

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

...
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

有什么想法吗?


答案 1

当关闭资源失败时,您通常不会执行任何重大操作。日志记录可能是一个好主意,这样您就有机会了解它是否更频繁地发生。

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

请注意,Java 7 专门引入了自动资源管理来简化这些类型的构造。如果你现在学习Java,那么我建议你选择最新和最伟大的。


答案 2

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


推荐