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!"; }
上面的示例将输出以下内容:
哦哦!世界,您好-我现在结束了-到家了!
抛出
在PHP7中,我们看到了Throwable接口Error以及Exception实现的介绍。这将在PHP7中的异常之间添加服务协定级别,并允许您为自己的自定义异常实现接口:
$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);
在PHP7之前,您可以简单地键入提示,Exception因为从PHP5开始,所有异常类都对其进行了扩展。