Подтвердить что ты не робот

Php - попробуйте, поймайте и повторите попытку

Иногда мой код ломается, и он находится вне моего контроля

Как я могу сделать следующее?

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

Код не так много, поэтому все его функции, поэтому я не хотел делать и вызывать другую функцию, если мне не приходилось

4b9b3361

Ответ 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!";
}

Здесь мы выполняем цикл do...while, чтобы код выполнялся хотя бы один раз. Если функция executeCode() обнаруживает ошибку, она выкинет Exception, который будет захвачен блоком try...catch. Блок catch затем увеличит переменную $attempt на единицу и вызовет continue, чтобы проверить условие while для следующей итерации. Если уже было пять попыток, цикл выйдет, и script может продолжить. Если ошибки нет, т.е. Оператор continue из блока catch не выполняется, цикл будет break, таким образом заканчивая script.

Обратите внимание на использование функции set_error_handler, взятой из здесь. Мы делаем это так, чтобы все ошибки в функции executeCode() были пойманы, даже если мы сами не вручную бросаем ошибки.

Если вы считаете, что ваш код может не работать много раз, функция sleep() может быть полезной перед оператором continue. "Замедление" по бесконечному циклу поможет вам уменьшить ваш CPU Usage.

Не рекомендуется бесконечно работать script до тех пор, пока он не будет успешным, поскольку ошибка, которая присутствует в первых 100 итерациях цикла, вряд ли когда-либо будет разрешена, что вызовет script "заморозить". Больше, чем нет, лучше переоценить код, который вы бы хотели запускать несколько раз в случае ошибки, и улучшить его, чтобы должным образом обрабатывать любые возникающие ошибки.

Ответ 2

Я не совсем понимаю, почему вы захотите, потому что есть хороший шанс создать бесконечный цикл. Однако, если код, вероятно, преуспеет после небольшого сна, по какой-либо причине ниже находится решение

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

    sleep(2); // 2 seconds
}

Ответ 3

Чтобы уловить исключение, вы должны сначала выбросить его. Что-то вроде этого.

<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    return 1/$x;
}

try {
    echo inverse(5) . "\n";
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

// Continue execution
echo "Hello World\n";
?>

Есть определенные встроенные исключения: http://php.net/manual/en/spl.exceptions.php