2016-01-11 3 views
10

私のアプリはrabbitMQに接続します。場合によってはAMQPTimeoutExceptionが投げられます。具体的には「エラーは、データを送信するソケット接続がタイムアウト。。」例外をキャッチしてプログラムの実行を継続するのがベストプラクティスですか?

私のソリューション:

私はAMQPTimeoutExceptionをキャッチし、私の再接続方法を呼んでいます。その後、プログラムは正常に実行され続けます。また、私は、例外が最大で3回処理されるようにフラグを設定しました。

try 
{ 
    sendMethod($message); 
} catch (AMQPTimeoutException $e) { 
     echo "caught socket connection exception". "\n"; 
     $this->reconnect($message, $exchangeName, $queue); 
    } 
//reconnect internally checks the flag 

私の質問:これはベストプラクティスですか?それ以外の解決策はありえませんか?

注::このアプリはPHPで書かれています。

+0

この状況では、私にはうまく見えます。 3回の試行で失敗した場合はどうなりますか? – Clay

+0

これは本当にベストプラクティスです。ユーザーにエラーメッセージを表示するだけで、ユーザーに問題を引き起こすだけでなく、システム上のハッカーのための穴が作成される可能性があります。 –

+0

@claytonプログラムは終了します – user3452275

答えて

6

はい。

例外は常にキャッチして処理する必要があります。これは最も確かにベストプラクティスです。例外は、プログラマが起こることはほとんど予想されない、またはほとんど起こりそうにないことを処理できるようにする言語の制御フロー構造です。

あなたのシナリオでは、ソケットに関して例外をキャッチするのは完全に合理的です。 TCP/IP通信は完璧ではなく、さまざまな状況に応じて、ソケットの障害はある時点で100%確実です。

これらのソケットタイムアウトが発生する理由をログに記録することをお勧めします。通常、リソースの枯渇によるものですが、その場所はどこですか?サーバーAまたはサーバーB ...またはそのクライアント...

タイムアウトは、調査する必要がある問題の症状です。それらを正しく処理している間、いくつかのログを追加して、それらがなぜ発生しているのかを知ることを強くお勧めします。

関連する問題