時々私のコードが壊れて、それは私の制御不能です
どうすれば次のことができますか?
try {
//do my stuff
}
catch {
//sleep and try again
}
コードはそれほど多くないので、それはすべて1つの関数です。
次のようなものを試すことができます:
_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回の繰り返しに存在するエラーが解決される可能性は低いため、スクリプトが「フリーズ」するため、スクリプトを成功するまで無限に実行することはお勧めできません。多くの場合、エラーが発生した場合に複数回実行するコードを再評価し、発生するエラーを適切に処理するように改善することをお勧めします。
単に:
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;
}
}
簡単なアルゴリズムを次に示します。
do{
try {
$tryAgain = false;
/* Do everything that throws error here */
}
catch(Exception $e) {
$tryAgain = true;
/* Do error reporting/archiving/logs here */
}
} while($tryAgain);
無限ループを作成する可能性は十分にあるので、なぜあなたがそうしたいのか完全には理解していません。ただし、何らかの理由でコードが少しスリープした後に成功する可能性がある場合は、以下が解決策です
while(true){
// execute the code you are attempting
if(some condition to signal success){
break; // exit the loop
}
sleep(2); // 2 seconds
}