Parfois, mon code se brise et il est hors de mon contrôle
Comment pourrais-je faire ce qui suit?
try {
//do my stuff
}
catch {
//sleep and try again
}
Le code n'est pas si important, donc c'est une seule fonction, donc je ne voulais pas faire et appeler une autre fonction si je n'avais pas à
Vous pouvez essayer quelque chose comme ça:
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!";
}
Ici, nous effectuons une boucle do...while
pour que le code soit exécuté au moins une fois. Si la fonction executeCode()
rencontre une erreur, une variable Exception
sera capturée par le bloc try...catch
. Le bloc catch
incrémente ensuite la variable $attempt
de un et appelle continue
pour tester la condition while
à la prochaine itération. S'il y a déjà eu cinq tentatives, la boucle se fermera et le script pourra continuer. S'il n'y a pas d'erreur, c'est-à-dire que l'instruction continue
du bloc catch
n'est pas exécutée, la boucle sera break
, terminant ainsi le script.
Notez l'utilisation de la fonction set_error_handler
tirée de here . Nous faisons cela pour que toutes les erreurs de la fonction executeCode()
soient interceptées, même si nous ne les lançons pas manuellement.
Si vous pensez que votre code peut échouer plusieurs fois, la fonction sleep()
peut être utile avant l'instruction continue
. "Ralentir" la boucle éventuellement infinie aidera à réduire votre CPU Usage
.
Ce n'est pas une bonne idée d'exécuter un script à l'infini jusqu'à ce qu'il réussisse, car il est peu probable qu'une erreur présente dans les 100 premières itérations d'une boucle soit résolue, ce qui provoque le blocage du script. Plus souvent qu'autrement, il est préférable de réévaluer le code que vous souhaitez exécuter plusieurs fois en cas d'erreur et de l'améliorer pour gérer correctement les erreurs qui se produisent.
Simplement:
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;
}
}
Voici un algorithme simple:
do{
try {
$tryAgain = false;
/* Do everything that throws error here */
}
catch(Exception $e) {
$tryAgain = true;
/* Do error reporting/archiving/logs here */
}
} while($tryAgain);
Je ne comprends pas très bien pourquoi vous voudriez, car il y a de bonnes chances que vous créiez une boucle infinie. Toutefois, si le code est susceptible de réussir après un petit sommeil, pour une raison quelconque, voici une solution
while(true){
// execute the code you are attempting
if(some condition to signal success){
break; // exit the loop
}
sleep(2); // 2 seconds
}