我正在一个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
但是,结果是:
听起来不错,但是不起作用
听起来不错,但是不起作用
有人可以帮助我实现我想要的结果吗?
答案 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();
注意!更改错误处理程序会影响所有即将发生的错误。甚至在您使用的库中引发的错误。请记住,这些是代码段。未经测试或不打算在生产中使用。希望能有所帮助。