在协程编程中可直接使用try/catch处理异常。但必须在协程内捕获,不得跨协程捕获异常。
不仅是应用层throw的Exception,底层的一些错误也是可以被捕获的,如function、class、method不存在
错误
下面的代码中,try/catch和throw在不同的协程中,协程内无法捕获到此异常。当协程退出时,发现有未捕获的异常,将引起致命错误。Fatal error: Uncaught RuntimeExceptiontry {
Swoole\Coroutine::create(function () {
throw new \RuntimeException(__FILE__, __LINE__);
});
}
catch (\Throwable $e) {
echo $e;
}
正确
在协程内捕获异常。function test() {
throw new \RuntimeException(__FILE__, __LINE__);
}
Swoole\Coroutine::create(function () {
try {
test();
}
catch (\Throwable $e) {
echo $e;
}
});