1

私はこれに似たものを持っています。

void func() {
  try {
    //socket disconnects in middle of ..parsing packet..
  } catch(Exception ex) {
   if(!ex.getMessage().toString().equals("timeout") || !ex.getMessage().toString().equals("Connection reset")) {
     debug("Exception (run): " + ex.getMessage());
     ex.printStackTrace();
  }
}

接続リセット例外またはタイムアウト例外が発生した場合でも、条件内に収まるのはなぜですか。toString なしで試してみましたが、運がありませんでした。

4

2 に答える 2

9

すべての例外をキャッチしてから、例外のエラー メッセージをテストする必要はありません。代わりに、処理する予定の例外 ( SocketTimeoutExceptionなど) のみをキャッチします。

catch (SocketTimeoutException ex)
{
    // Do something...
}

現在のコードでは、予期していなかった他の種類の例外をキャッチしている可能性があります。現在、この例外は無視され、ログに記録されません。これにより、何が起こっているのかをデバッグすることが非常に難しくなる可能性があります。処理できない例外がある場合は、再スローするかログに記録する必要があります。

すべての例外をキャッチしたい

本当にやりたい場合は、次のようにコードを記述できます。

catch (SocketTimeoutException ex)
{
    // Do something specific for SocketTimeoutException.
}
catch (Exception ex)
{
    // Do something for all other types of exception.
}

特定のエラーに関して、次のように書いています。

!a.equals(b) || !a.equals(c)

この式は常に true と評価されます。あなたが意味したのは:

!a.equals(b) && !a.equals(c)

または同等:

!(a.equals(b) || a.equals(c))

上記で提案したようにコードを書き直すことで、この複雑なブール式を記述する必要が完全に回避されることに注意してください。

于 2010-08-22T18:11:59.860 に答える
0

例外の原因を知るために例外メッセージに頼るのは本当に安全ではありません。

あなたの場合SocketTimeoutException、クラシックなどのより具体的な例外をキャッチしようとすることができますIOException

void func() {
    try {
        //socket disconnects in middle of ..parsing packet..
    } catch(SocketTimeoutException ex) {
        //In case of Time out
    } catch(IOException ex){
        //For other IOExceptions
    }
}

出典:

[Socket.connect()] [3]

例外メッセージで情報を探す場合でも、メッセージが単に「タイムアウト」に等しいかどうかを確認するのではなく、メッセージに「タイムアウト」が含まれているかどうかを確認する必要があります。

[3]:http ://download-llnw.oracle.com/javase/6/docs/api/java/net/Socket.html#connect(java.net.SocketAddress 、int)

于 2010-08-22T18:15:56.183 に答える