php - 尝试,捕获并重试

2022-08-30 10:37:20

有时我的代码会中断,它超出了我的控制范围

我该怎么做?

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...whileexecuteCode()Exceptiontry...catchcatch$attemptcontinuewhilecontinuecatchbreak

请注意从此处获取的函数的使用。我们这样做是为了捕获函数中的所有错误,即使我们自己不手动抛出错误。set_error_handlerexecuteCode()

如果您认为您的代码可能会失败多次,则 sleep() 函数在语句之前可能是有益的。“减慢”可能的无限循环将有助于降低您的.continueCPU Usage

让脚本无限运行直到成功不是一个好主意,因为在循环的前 100 次迭代中存在的错误不太可能得到解决,从而导致脚本“冻结”。通常,最好在发生错误时重新评估要多次运行的代码,并对其进行改进以正确处理遇到的任何错误。


答案 2

只是:

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;
        }
    }
}

推荐