假设一些代码可以在套接字上正常工作:创建客户端和服务器套接字,写入SocketOutputStream,从SocketInputStream读取等等。当然,底层的套接字方法可能会抛出SocketException
及其派生类。
我区分两种类型的错误。预期的错误-我们总是应该预期网络故障,并通过重新连接或用户可读的错误消息对它们做出反应。预期错误的重要示例是TCP连接丢失。意外错误-肯定表明我们软件存在错误的错误,应仔细记录此类堆栈跟踪记录,甚至应终止整个应用程序。
我没有找到一种可靠的方法来区分由连接丢失引起的SocketException与任何其他套接字错误。 SocketException中没有错误代码,也没有子类。 java.net
包中的所有方法仅抛出SocketException
并显示不同的错误消息:
Socket closed
-在大多数情况下抛出。socket closed
-可以从Windows implementation of SocketInputStream.socketRead0
抛出。Software caused connection abort: .*
-可以从Windows中的许多本机方法抛出。Broken pipe (Read|Write failed)
-可以从Unix套接字实现中的SocketInputStream.socketRead0
或SocketOutputStream.socketWrite0
中抛出。socket write error
-在SocketOutputStream.socketWrite0
for Windows中。是否有任何方法可以确定特定的SocketException
是由丢失的TCP连接引起的,还是唯一的方法是分析错误消息?如果是这样,也许存在执行该检查的库?还是我做错了什么,应该/永远不要忽略任何与之有关的SocketExceptions问题?