首页 > 解决方案 > 处理 spatie 异步错误处理

问题描述

我正在处理一个 PHP 项目的异步过程。我正在使用一个名为spatie/async的库。代码片段如下所示:

foreach (range(1, 2) as $i) {
    $pool->add(function () use ($i) {
        // Do a thing
        try {
            $result = $i / 0; // This will cause an error
            return "Works";
        } catch (\Exception $e) {
            return -1;
        }
    })->then(function ($output) {
        // Handle success
        echo (output . "\n");
    })->catch(function ($exception) {
        // When an exception is thrown, it's caught and passed here.
        echo "Sounds good, but don't work\n";
    })
}

$pool->wait();

我想要的只是当$result出现错误时,它会进入内部catch,但相反,它会下降到底部捕获,这会导致与我想要的结果不同。

我想要的结果是:

-1

-1

但相反,结果是:

听起来不错,但不工作

听起来不错,但不工作

任何人都可以帮助我达到我想要的结果吗?

标签: phpasynchronous

解决方案


您的代码的问题是,它不会在 add 方法调用中引发异常。除以 0 只会导致错误,但不会导致异常。我建议不要更改整个 php 错误处理程序,而是在您的 add 方法调用中稍微扩展您的逻辑。

$divisor = 0;
$pool->add(function() use ($i, $divisor) {
    try {
        if ($divisor === 0) {
             throw new \LogicException('Division by zero!');
        }

        return $i / $divisor;
    } catch (\LogicException $e) {
        return -1;
    }
});

另一种解决方案可能是更改池方法调用的错误处理。

set_error_handler(function () {
    throw new \LogicException('Ouch!');
});

$pool->add(function() use ($i) {
    try {
        $result = $i / 0;
    } catch (\LogicException $e) {
        return -1;
    }
});

restore_error_handler();

警告!更改错误处理程序会影响所有即将发生的错误。甚至在您使用的库中抛出的错误。请记住,这些是代码片段。这未经测试或未考虑在生产中使用。希望能有所帮助。


推荐阅读