首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >php - try、catch和retry

php - try、catch和retry
EN

Stack Overflow用户
提问于 2014-07-29 02:47:34
回答 6查看 35.9K关注 0票数 46

有时我的代码崩溃了,这超出了我的控制范围

我该怎么做呢?

代码语言:javascript
复制
try {
//do my stuff
}
catch {
//sleep and try again
}

代码不是很多,所以都是一个函数,所以如果没有必要,我不想创建和调用另一个函数

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-07-29 03:27:00

您可以尝试如下所示:

代码语言:javascript
复制
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()函数遇到错误,它将抛出try...catch块将捕获的Exception。然后,catch块将使变量$attempt递增1,并调用continue为下一次迭代测试while条件。如果已经进行了五次尝试,则循环将退出,脚本可以继续。如果没有错误,即未执行来自catch块的continue语句,则循环将执行break,从而结束脚本。

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

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

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

票数 80
EN

Stack Overflow用户

发布于 2018-05-23 17:41:11

简单地说:

代码语言:javascript
复制
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;
        }
    }
}
票数 8
EN

Stack Overflow用户

发布于 2018-08-15 18:41:37

这里有一个简单的算法:

代码语言:javascript
复制
    do{
        try {
            $tryAgain = false;
            /* Do everything that throws error here */

        }
        catch(Exception $e) {
            $tryAgain = true;
            /* Do error reporting/archiving/logs here */

        }
    } while($tryAgain);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25002164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档