× 警告!旧版文档已经暂停维护,请查看新版文档。点击前往新版文档

捕获异常和错误

可捕获的异常/错误

PHP大致有三种类型的可捕获的异常/错误

  1. ErrorPHP内核抛出错误的专用类型, 如类不存在, 函数不存在, 函数参数错误, 都会抛出此类型的错误, PHP代码中不应该使用Error类来作为异常抛出
  2. Exception:应用开发者应该使用的异常基类
  3. ErrorException:此异常基类专门负责将PHPWarning/Notice等信息通过set_error_handler转换成异常, PHP未来的规划必然是将所有的Warning/Notice转为异常, 以便于PHP程序能够更好更可控地处理各种错误

以上所有类都实现了Throwable接口, 也就是说, 通过try {} catch(Throwable $e) {} 即可捕获所有可抛出的异常/错误

实例 1

try {
    test();
} 
catch(Throwable $e) {
    var_dump($e);
}

实例 2

try {
    test();
}
catch (Error $e) {
    var_dump($e);
}
catch(Exception $e) {
    var_dump($e);
}

不可捕获的致命错误和异常

PHP错误的一个重要级别, 如异常/错误未捕获时, 内存不足时, 或是一些编译期错误(继承的类不存在), 将会以E_ERROR级别抛出一个Fatal Error, 是在程序发生不可回溯的错误时才会触发的, PHP程序无法捕获这样级别的一种错误, 只能通过register_shutdown_function在后续进行一些处理操作。

在协程中捕获运行时异常/错误

Swoole4协程编程中,某个协程的代码中抛出错误,会导致整个进程退出,进程所有协程终止执行。在协程顶层空间可以先进行一次try/catch捕获异常/错误。仅终止出错的协程。

go(function () {
    try {
        call_user_func($func);
    }
    catch (Error $e) {
        var_dump($e);
    }
    catch(Exception $e) {
        var_dump($e);
    }
});

//协程1的错误不影响协程2
go(function () {
    Co::sleep(100);
});

  • 小六HI

    未来还有没有这块新的异常捕获?