异常和错误处理
试着抓
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
的第二个处理程序。
最后
如果你需要在 try
或 catch
完成运行后完成某些事情,你可以使用 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 开始,所有异常类都会扩展它。