php - 尝试、捕获和重试

新手上路,请多包涵

有时我的代码会崩溃,这是我无法控制的

我将如何执行以下操作?

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

代码并不多,所以都是一个函数,所以如果不需要的话,我不想创建和调用另一个函数

原文由 user3869692 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 402
2 个回答

你可以尝试这样的事情:

 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 块将捕获。 The catch block will then increment the variable $attempt by one and call continue to test the while condition for the next iteration.如果已经有五次尝试,循环将退出并且脚本可以继续。如果没有错误,即来自 catch 块的 continue 语句没有被执行,循环将 break 脚本。

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

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

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

原文由 noahnu 发布,翻译遵循 CC BY-SA 3.0 许可协议

简单地 :

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

原文由 Reign.85 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏