处理大量异步错误处理

时间:2019-07-05 07:57:23

标签: php asynchronous spatie

我正在一个PHP项目上进行异步处理。我正在使用一个名为"spatie"的库。代码段如下所示:

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

但是,结果是:

  

听起来不错,但是不起作用

     

听起来不错,但是不起作用

有人可以帮助我实现我想要的结果吗?

1 个答案:

答案 0 :(得分:1)

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

$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();

注意!更改错误处理程序会影响所有即将发生的错误。甚至在您使用的库中引发的错误。请记住,这些是代码段。未经测试或不打算在生产中使用。希望能有所帮助。