继续try-catch块中的当前迭代|PHP语言

6za6bjd0  于 2023-02-28  发布在  PHP
关注(0)|答案(4)|浏览(210)

在我的脚本中,有时会出现服务器、连接、配置或API问题,因此我实现了一个try-catch块来正确地捕获异常并跳过它们。
...但是我的问题没有用这个解决方案解决,因为元素(引发问题的元素)不是问题本身。所以基本上我的问题是是否有任何方法可以捕获错误并从您离开的地方继续:不是跳过错误并转到下一个元素,而是在foreach循环中重复当前迭代。
显然,* 继续 * 和 * 中断 * 不起作用!

foreach($xx as $x) {
    try {
        //main code
    } catch (Exception $e) {
        echo 'Caught exception: ', $e->getMessage(), "\n";
        sleep(10);
    }
}

......当catch部分捕获到错误时,代码应该使用当前的$x(最初捕获错误/抛出错误的地方)重复try循环,然后继续处理元素列表。

wh6knrhe

wh6knrhe1#

将try块放入它自己的while (true)循环中,如果成功,您可以执行break

while (true) {
    try {
        ...
        break;
    } catch (...) {
        ...
    }
}

这将重试相同的操作,直到没有异常抛出为止。为了避免在操作上出现永远不会成功的无限循环,您可以添加一个计数器,如:

$tries = 0;
while ($tries < 10) {
    $tries++;
    try { ... }
}
t8e9dugd

t8e9dugd2#

你可以运行for循环来代替foreach循环,并且可以通过递减catch块中的递增计数器来管理它,以获得当前的$x(它最初捕获错误/抛出错误的地方),然后再次使用同一个元素重试。这可能会导致无限循环,因此请保持重试的任何阈值。

ef1yzkbh

ef1yzkbh3#

一旦抛出并捕获了异常,就无法返回到抛出异常的代码块。不幸的是,在技术上不可能只有一个try catch块,在那里捕获所有异常,然后判断它们是否重要(并停止脚本的执行),或者异常不是真实的的问题,您希望您的脚本表现得好像没有异常一样。
我能给予你的唯一解决办法是:

foreach($xx as $x) {
    try {
        //main code

        try {
            //first code that can cause an exception
            //you just want to continue after
        } catch (Exception $e) {
            echo "Nothing wrong, just an exception " . $e->getMessage(), "\n";
        }

        try {
            //second code that can cause an exception
            //a serious problem, you don't want to continue
        } catch (Exception $e) {
            echo "This is a real problem " . $e->getMessage(), "\n";
            throw $e; //re-trowing exception
        }

        //third code that can cause an exception

    } catch (Exception $e) {
        //will catch exception from code 2 and 3 but not 1.

        echo 'Caught exception: ', $e->getMessage(), "\n";
        sleep(10);
    }
}

顺便说一句,你所要求的不是使用异常而是在错误的情况下。如果一个错误被通知,并且它是可恢复的,你可以为错误写一个全局处理程序,在这个错误处理程序中决定这个错误是一个问题,你想要关闭你的脚本还是仅仅记录它,然后返回到脚本执行,就好像根本没有错误一样。但是这是关于错误的,而不是异常。

kmpatx3s

kmpatx3s4#

使用while循环,并进行定义的尝试次数(即3次)。

  • 如果发生异常:递增尝试并重新迭代循环。
  • 如果未发生异常,则中断循环并继续下一步。

我进一步的建议是记录跟踪异常和尝试次数。

$try = 0;
while($try < 3) {
    try {
        // your code here
        break;
    }catch(Exception $e) {
        $try++;

        $err = 'Exception:'.$e->getMessage().'Retrying..'.$try;
        Log::error($err); // this is Laravel log example.. can be different       
    }
}

相关问题