web-dev-qa-db-ja.com

php-試行、キャッチ、再試行

時々私のコードが壊れて、それは私の制御不能です

どうすれば次のことができますか?

try {
//do my stuff
}
catch {
//sleep and try again
}

コードはそれほど多くないので、それはすべて1つの関数です。

32
user3869692

次のようなものを試すことができます:

_function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");

$NUM_OF_ATTEMPTS = 5;
$attempts = 0;

do {

    try
    {
        executeCode();
    } catch (Exception $e) {
        $attempts++;
        sleep(1);
        continue;
    }

    break;

} while($attempts < $NUM_OF_ATTEMPTS);

function executeCode(){
    echo "Hello world!";
}
_

ここでは、コードが少なくとも1回実行されるように_do...while_ループを実行します。 executeCode()関数でエラーが発生した場合、_try...catch_ブロックがキャプチャするExceptionがスローされます。 catchブロックは、変数_$attempt_を1つ増やし、continueを呼び出して、次の反復のwhile条件をテストします。すでに5回試行されている場合、ループは終了し、スクリプトは続行できます。エラーがない場合、つまりcontinueブロックのcatchステートメントが実行されない場合、ループはbreakになり、スクリプトが終了します。

here から取得した_set_error_handler_関数の使用に注意してください。手動でエラーをスローしなくても、executeCode()関数内のすべてのエラーがキャッチされるようにこれを行います。

コードが何度も失敗する可能性があると思われる場合は、continueステートメントの前に sleep() 関数が役立つ場合があります。無限ループの可能性を「遅く」すると、_CPU Usage_が低くなります。

ループの最初の100回の繰り返しに存在するエラーが解決される可能性は低いため、スクリプトが「フリーズ」するため、スクリプトを成功するまで無限に実行することはお勧めできません。多くの場合、エラーが発生した場合に複数回実行するコードを再評価し、発生するエラーを適切に処理するように改善することをお勧めします。

57
noahnu

単に:

function doSomething($params, $try = 1){
    try{
        //do something
        return true;
    }
    catch(Exception $e){
        if($try <5)
             sleep(10);
             //optionnaly log or send notice mail with $e and $try
             doSomething($params, $try++);
        else 
             return false;
    }
}
5
Reign.85

簡単なアルゴリズムを次に示します。

    do{
        try {
            $tryAgain = false;
            /* Do everything that throws error here */

        }
        catch(Exception $e) {
            $tryAgain = true;
            /* Do error reporting/archiving/logs here */

        }
    } while($tryAgain);
2
Amir Forsati

無限ループを作成する可能性は十分にあるので、なぜあなたがそうしたいのか完全には理解していません。ただし、何らかの理由でコードが少しスリープした後に成功する可能性がある場合は、以下が解決策です

while(true){
    // execute the code you are attempting
    if(some condition to signal success){
        break; // exit the loop
    }

    sleep(2); // 2 seconds
}
0
Alex