2

SocketException(またはソケットにBufferedReaderを使用している場合はIOException)が発生した場合、接続全体が不良であると見なす必要がありますか?

ソケットの読み取りまたは書き込み時に発生する可能性のある「致命的ではない」例外があるかどうか、多かれ少なかれ疑問に思っています。例外は発生しますが、ソケットは引き続き使用できます。

4

2 に答える 2

1

SocketExceptionのサブクラスのjavadocをコンパイルすると、そのような例外から回復してソケットを再利用できないことがわかります。

  • BindException ソケットをローカルアドレスとポートにバインドしようとしたときにエラーが発生したことを通知します。通常、ポートが使用中であるか、要求されたローカルアドレスを割り当てることができませんでした。

  • ConnectException ソケットをリモートアドレスおよびポートに接続しようとしたときにエラーが発生したことを通知します。通常、接続はリモートで拒否されました(たとえば、リモートアドレス/ポートでリッスンしているプロセスはありません)。

  • NoRouteToHostException ソケットをリモートアドレスおよびポートに接続しようとしたときにエラーが発生したことを通知します。通常、ファイアウォールが介在しているため、または中間ルーターがダウンしている場合、リモートホストに到達できません。

  • PortUnreachableException 接続されたデータグラムでICMPポート到達不能メッセージが受信されたことを通知します。

SocketException自体:TCPエラーなど、基盤となるプロトコルにエラーがあることを示すためにスローされます。

したがって、TCPはすでに送信の問題から確実に回復しようとしているため、続行する方法はありません。

于 2012-04-12T15:29:30.023 に答える
1

SocketExceptionsが致命的であるとは言えませんが、接続全体が不良であると見なす必要があります。スタッカーによる以前の回答に完全に同意しますが、SocketExceptionはエラーではなく例外の子であることに注意することが重要です。エラーの子は致命的であると考えますが、例外は回復可能な状態になる可能性があります。残念ながら、この場合、回復可能な状態は新しい接続を開くことです。

ビジネスロジックによっては、IOErrorを拡張するクラス(IOError extends Error)を作成し、ソケットを失うとアプリケーションが回復不能になる必要がある場合は、例外としてではなくIOErrorとしてキャッチして再スローすると便利な場合があります。状態であり、合理的に処理することはできません。

于 2012-04-12T16:09:43.473 に答える