php – попробуйте, поймайте и повторите попытку

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

Как бы я сделал следующее?

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

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

Вы можете попробовать что-то вроде этого:

 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 while, чтобы код выполнялся хотя бы один раз. Если executeCode() обнаруживает ошибку, она выкинет Exception которое захватит блок try...catch . Блок catch затем увеличит переменную $attempt на единицу и вызовет continue для проверки условия while для следующей итерации. Если уже было пять попыток, цикл завершится, и скрипт может продолжить работу. Если ошибки нет, то есть оператор continue из блока catch не выполняется, цикл break , тем самым заканчивая скрипт.

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

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

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

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

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

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

 <?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