web-dev-qa-db-fra.com

php - essayez, attrapez et réessayez

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 à

30
user3869692

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.

47
noahnu

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;
    }
}
3
Reign.85

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);
1
Amir Forsati

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
}
0
Alex