异常和错误处理

试着抓

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

try {
    // Do a bunch of things...
    throw new Exception('My test exception!');
} catch (Exception $ex) {
    // Your logic failed. What do you want to do about that? Log it:
    file_put_contents('my_error_log.txt', $ex->getMessage(), FILE_APPEND);
}

以上示例将在 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 的第二个处理程序。

最后

如果你需要在 trycatch 完成运行后完成某些事情,你可以使用 finally 声明:

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

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

哦哦! Hello World - 我现在完成了 - 回家的时间!

抛出

在 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 开始,所有异常类都会扩展它。