所有SocketExceptions都“致命”吗?

时间:2012-04-12 15:21:00

标签: java sockets

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

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

2 个答案:

答案 0 :(得分:1)

SocketException子类的javadoc汇编表明您无法从这样的异常中恢复并重用套接字。

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

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

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

  • <强> PortUnreachableException 表示已在连接的数据报上收到ICMP Port Unreachable消息。

SocketException本身:抛出以指示底层协议中存在错误,例如TCP错误。

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

答案 1 :(得分:1)

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

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