例外の遅延


1

定期的に(たとえば10秒に1回)サーバーに接続し、そこからデータを読み取ろうとする方法があります。サーバーが常に使用可能でない可能性があります。サーバーが利用できない場合、このメソッドは例外をスローします。

サーバーが少なくとも1分間使用できなかった場合を除き、例外をスローしないラッパーメソッドを実装する最善の方法は何でしょうか?

7

最後にサーバーに最後に到達した時刻を記録します。サーバーが例外をスローした場合は、それをキャッチし、サーバーに最後に到達した時刻と比較します。その時間が1分以上ある場合は、例外を再起します。

  0

サーバーは実際には例外をスローしませんが、それはスローするクライアントコードです;)しかし、私はあなたの答えに+1を投票しました。 23 9月. 082008-09-23 21:07:39


1

最初にサーバーに接続して例外をキャッチしようとした時間を記録する必要があります。例外がキャッチされた時間が元の時間+ 1分を超える場合は、例外を再投入します。そうでない場合は、再試行してください。

  0

私は狙撃されました。 23 9月. 082008-09-23 21:07:00


1

理想的には、サーバーへのコールにタイムアウトを設定できます。失敗した場合、catchブロック内のthread.sleep(600)を実行してもう一度試してください。2番目のスレッドが戻ってこない場合は失敗します。

  0

タイムアウトも私の心に浮かぶ。 24 9月. 082008-09-24 03:38:02


3

擬似コード。

//Create Timer 
//Start Timer 
bool connected = false; 

while (!connected) 

    try { 
     //Connect To DB 

     connected = true; 
    } 
    catch (Exception ex) { 
     if (more than 1 minute has passed) 
      throw new Exception(ex); 
    } 

} 

0

あなたが再試行回数を持っている、と(自分の場合は6)は、所望のカウントが満たされていたならば、あなたがのためにブール変数を設定することができ

int count = 0; 

CheckServer(count); 

public void CheckServer(count) { 
try 
{ 
    // connect to server 
} 
catch(Exception e) 
{ 
if(count < MAX_ATTEMPTS) { 
    // wait 10 seconds 
    CheckServer(count++) 
    } 
    else { 
    throw e; 
    } 
} 
} 

0

例外をスローする可能性かどうかサーバー接続が成功し、そのように、あなたの例外ハンドラでそれを確認しました:私は最後のJavaを使用するので、それがしばらくしているので、

class ServerTester : public Object 
{ 
    private bool failing; 
    private ServerConnection serverConnection; 
    private Time firstFailure; 

    public ServerTester(): failing(false) 
    { 
    } 

    public void TestServer() throws ServerException 
    { 
    try 
    { 
     serverConnection.Connect(); 
     failing = false; 
    } 
    catch (ServerException e) 
    { 
     if (failing) 
     { 
     if (Time::GetTime() - firstFailure > 60) 
     { 
      failing = false; 
      throw e; 
     } 
     } 
     else 
     { 
     firstFailure = Time::GetTime(); 
     failing = true; 
     } 
    } 
    } 
} 

私は、実際の時間のAPIがあるのか​​分かりません。これはあなたが尋ねることをしますが、それについては正しいとは思われません。例外をポーリングすると少し後退しますが、サーバーを扱っているので、私の頭の上から他の方法は考えられません。


1

例外処理は、通常の "返品"システムのという非常に特殊な用途です。 (詳細については、「モナド」を参照してください。)シグナルを出したい例外的な状況がJavaの例外処理システムに自然に当てはまらない場合は、の例外を使用することは適切ではないかもしれません。

通常の方法でエラー状態を追跡できます。状態変数を保持し、必要に応じて成功/失敗情報で更新し、状態が変化すると適切に応答します。