php - 处理 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
但相反,结果是:
听起来不错,但不工作
听起来不错,但不工作
任何人都可以帮助我达到我想要的结果吗?
解决方案
您的代码的问题是,它不会在 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();
警告!更改错误处理程序会影响所有即将发生的错误。甚至在您使用的库中抛出的错误。请记住,这些是代码片段。这未经测试或未考虑在生产中使用。希望能有所帮助。
推荐阅读
- html - 如果使用 CSS 为空,则动态隐藏 div 字段
- python - 包导入在 Python 交互窗口(在 VSCode 中)中有效,但在终端运行的 python 中无效?
- reactjs - 无法分配 RefObject
到 RefObject 实例 - timestamp - 批量加载时间戳格式
- lua - 即使玩家生命值 < 0,也不会调用 Roblox 死亡事件
- java - 如何在 Intellij Idea CE 2020.1 build 201.6668.60 中触发插件的自动重新加载
- python - pandas Series.tolist() 中的 NaN 的行为与列表中的 NaN 不同
- f# - F#:以编程方式操作标识符
- awk - 我怎样才能把星星的数量作为awk中的数量?
- c++ - Vector 与使用 push_back() 的函数大小相同