2011-12-20 9 views
0

ソケットを受け取り、3つの値を返す関数を作成しています 0 =本当に悪いエラーが出口スレッドに発生しました 1 =接続に話をしています =何かが起こったら、別の受け入れ(タイムアウト)してください。ソケット受け入れによって例外が発生した場合、どうしてその理由を知ることができますか?

IOExceptionには、throwableオブジェクトを返すGetCauseメソッドがあります。 このthrowableオブジェクトには、throwableを返すget causeメソッドがあります。このメソッドは、throwableを返すgetcuaseメソッドを備えています。このメソッドは永遠に続行され、別のthrowableオブジェクトを取得し続けます。

どうすればいいのですか? 私はget理由と文字列の束を比較することができますが、これは信頼できるとは思われません。 テッド

int GetClient() 
{ 
    try { 
     server.setSoTimeout(5*1); 
     connection=server.accept(); 
    } 
    catch(IOException ec) 
    { 
     System.out.println(Thread.currentThread()+":"+ec.getMessage()); 


     return 2; // for time out or something where we can try again 
     // return a zero saying we must stop erra o bad 

    } 
    return 1; 
} 

答えて

0

タイムアウト例外にのみ興味がある場合は、それらの例外を個別にキャッチします。ほとんどのIOメソッドは潜在的にIOExceptionをスローする可能性がありますが、個別に捕捉して処理できる多くの異なるIOExceptionサブクラス(それ自体はさらにサブクラスがあります)があります。

例えば、

try { 
    conn = server.accept(); 
} catch (SocketTimeoutException e) { 
    return 2; 
} catch (IOException e) { 
    // socket exception will not be recaught 
    // even if return statement wasn't used 
    return 0; 
} 
return 1; 

例外が作成されたとき、彼らは文字列メッセージ、だけでなく、この例外がスローされる原因となった可能性が例外を作成することができるようgetCauseメソッドが提供されます。したがって、例外のキャッチャーが例外を引き起こした原因の詳細を見ることができます。

例えば、

public double addNumbers(String a, String b) { 

    try { 
     double i = Double.parseDouble(a); 
     double j = Double.parseDouble(b); 
     return i + j; 
    } catch (NullPointerException cause) { 
     throw new IllegalArgumentException(
      "Arguments aren't allowed to be null", cause); 
    } catch (NumberFormatException cause) { 
     throw new IllegalArgumentException(
      "One or more arguments weren't numbers", cause); 
    } 
} 

上記の場合は少し鈍角ですが、それは一部の例外をキャッチすることができる(多分それはから回収することを試みるかもしれない)、その後、新しい例外が原因として元の例外をスローすることを校長を実証。 getCauseメソッドを使用すると、呼び出し側は、addNumbersメソッドでIllegalArgumentExceptionが最初にスローされたことをすぐに知ることができます(これは、ユーザーコードベースの問題がある場所です)。しかし、原因を調べることで、引数についてのより詳細なメッセージが違法であることがわかります(NumberFormatExceptionには解析しようとしていた文字列が含まれています)。

1
accept() 

は、例外の様々なをスローします。 SocketTimeoutExceptionはIOExceptionを拡張しますが、一般的なIOExceptionをキャッチする前に 'catch'できます。これにより、あなたが再度試すことができることを示唆する値を返すことができます。

これは3つのケース、OK、IOException、およびタイムアウトをカバーしていますか?

関連する問題