2

当遇到 SocketException 时(或者当您使用 BufferedReader 作为套接字时遇到 IOException),整个连接是否应该被认为是坏的?

我或多或少想知道在读取或写入套接字时是否会发生任何“非致命”异常,发生异常但套接字仍然可用。

4

2 回答 2

1

我不会说 SocketExceptions 是致命的,但整个连接应该被认为是坏的。虽然我完全同意 stacker 之前的回答,但重要的是要注意 SocketException 是 Exception 而不是 Error 的子级。我认为 Error 的孩子是致命的,而 Exceptions 可以具有可恢复的状态。不幸的是,在这种情况下,可恢复状态将是打开一个新连接。

根据您的业务逻辑,如果需要丢失套接字会导致应用程序进入不可恢复状态,则创建一个扩展 IOError(IOError 扩展错误)并作为 IOError 而不是作为异常捕获并重新抛出的类可能会很有用状态,无法合理处理。

于 2012-04-12T16:09:43.473 回答
1

对SocketException子类的 javadoc 的编译表明,您无法从此类异常中恢复并重用套接字。

  • BindException 表示尝试将套接字绑定到本地地址和端口时发生错误。通常,端口正在使用中,或者无法分配请求的本地地址。

  • ConnectException 表示尝试将套接字连接到远程地址和端口时发生错误。通常,连接被远程拒绝(例如,没有进程正在侦听远程地址/端口)。

  • NoRouteToHostException 表示尝试将套接字连接到远程地址和端口时发生错误。通常,由于中间防火墙或中间路由器已关闭,无法访问远程主机。

  • PortUnreachableException 表示已在连接的数据报上接收到 ICMP 端口不可达消息。

SocketException 本身:抛出表明底层协议存在错误,例如 TCP 错误。

因此我会说是的,没有办法继续,因为 TCP 已经尝试确保从传输问题中恢复。

于 2012-04-12T15:29:30.023 回答