PHP 异常和错误处理

示例

试着抓

try..catch块可用于控制可能引发异常的程序流。它们可以被优雅地捕获和处理,而不是遇到PHP时停止运行:

try {
    // 做一堆事情...
    throw new Exception('我的测试异常!');
} catch (Exception $ex) {
    //您的逻辑失败。您要怎么做?记录它:
    file_put_contents('my_error_log.txt', $ex->getMessage(), FILE_APPEND);
}

上面的示例会将catch异常抛出到try块中,并将其消息(“我的测试异常!”)记录到文本文件中。

捕获不同的异常类型

您可以catch为以不同方式处理的不同类型的异常实现多个语句,例如:

try {
    throw new InvalidArgumentException('Argument #1 must be an integer!');
} catch (InvalidArgumentException $ex) {
    var_dump('Invalid argument exception caught: ' . $ex->getMessage());
} catch (Exception $ex) {
    var_dump('Standard exception caught: ' . $ex->getMessage());
}

在上面的示例中,catch将使用第一个,因为它按执行顺序匹配第一个。如果交换catch语句的顺序,则Exception捕获器将首先执行。

同样,如果要抛出一个UnexpectedValueException,则将看到Exception正在使用的标准的第二个处理程序。

最后

如果您需要在atry或acatch完成运行之后要做一些事情,可以使用以下finally语句:

try {
    throw new Exception('Hello world');
} catch (Exception $e) {
    echo 'Uh oh! ' . $e->getMessage();
} finally {
    echo " - I'm finished now - home time!";
}

上面的示例将输出以下内容:

哦哦!世界,您好-我现在结束了-到家了!

抛出

在PHP 7中,我们看到了Throwable接口Error以及Exception实现的介绍。这将在PHP 7中的异常之间添加服务协定级别,并允许您为自己的自定义异常实现接口:

$handler = function(\Throwable $ex) {
    $msg = "[ {$ex->getCode()} ] {$ex->getTraceAsString()}";
    mail('admin@server.com', $ex->getMessage(), $msg);
    echo myNiceErrorMessageFunction();
};
set_exception_handler($handler);
set_error_handler($handler);

在PHP 7之前,您可以简单地键入提示,Exception因为从PHP 5开始,所有异常类都对其进行了扩展。