Press "Enter" to skip to content

浅谈 PHP 异常和错误

Exception | Error | Throwable

php 中将环境配置错误、语法非法等判定为 Error。在逻辑上出现不合预期、与正常流程不同的状况判定为 Exception

php7 之前处理致命错误只是简单的停止脚本执行。php7 中 Error 和 Exception 都实现了 Throwable 接口,从而改变了大多数错误的报告方式 ,当致命错误(E_ERROR)和可捕获的错误(E_RECOVERABLE_ERROR)发生时会抛出异常而不是停止脚本运行,但是其他级别的错误如 warning 和 notice,和之前一样,是不会抛出异常的 并且一个未捕获的异常也会是一个致命错误

php7 中 Throwable 接口统一了 Exception 和 Error 两个异常分支(结构参考) 所以 php7 中,要捕获所有的异常应该使用 Throwable 而不是 Exception


try { throw new InvalidArgumentException(); } catch(Exception $e) { echo "异常会被捕获"; // 执行至此 } try { demo(); // 调用为定义函数,致命错误被打印到浏览器 } catch(Exception $e) { echo "捕获到了异常"; } try { throw new InvalidArgumentException(); } catch(Throwable $e) { echo "异常会被捕获"; // 执行至此 } try { demo(); } catch(Throwable $e) { echo "调用的未定义函数 demo"; // 执行至此 }

什么时候使用异常

我和大多数 phper 一样纠结这个问题,鸟哥对此也没有个定性,回过头来想想这种东西还得从实际情况出发,除了处理 php 自动抛出的异常比如 PDO 类

try {
    $pdo = new PDO('mysql://host=127.0.0.1;dbname=test');
} catch (PDOException $e) {
    $message = $e->getMessage();
}

使用异常预测潜在问题也是一种增强程序健壮性的一剂良方比如

try {
    $user = User::find(0);
    if (! $user) {
        throw new Exception();
    }
    $name = $user->name;
} catch(Throwable $e) {
    $name = 'default';
}

参考文献

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注