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开始,所有异常类都对其进行了扩展。