资讯专栏INFORMATION COLUMN

PHP最佳实践之异常和错误

TigerChain / 2931人阅读

摘要:预测和捕获并处理异常是我们自己的责任,因为未捕获的异常可能会导致应用终止运行,显示错误信息。处理并记录异常你的代码还原成之前的异常处理程序错误我们可以使用函数或者在文件中使用指令告诉报告或者忽略那些错误。

异常

1).异常是Exception类的对象,在遇到无法修复的状况时抛出,例如远程API没有响应或者数据库查询失败再或者是无法满足程序运行的前置条件。出现问题的时候异常用于主动出击,委托职责;异常还可以用于防守,预测潜在的问题来减轻影响。
2).Exception对象和其他的PHP对象一样,使用new关键字实例化。


第一个参数是消息,第二个参数是数字代码。数字代码是可选的,用于为指定的异常提供上下文。我们可以使用公开的实例方法getCodegetMessage来获得异常对象的两个属性。
3).假如遇到了异常情况,或者在当前的条件下无法操作,我们需要抛出异常。


4).我们必须抛出Exception类或者他的子类,PHP内置的异常类和其子类如下:

Exception

ErrorException
PHP标准库提供了下述额外的Exception子类,扩展了PHP内置的异常类。

LogicException

BadFunctionCallException

BadMethodCallException

DomainException

InvalidArgumentException

LengthException

OutOfBoundsException

RuntimeException

OutOfBoundsException

OverflowException

RangeException

UnderflowException

UnexpectedValueException

5).捕获异常。预测和捕获并处理异常是我们自己的责任,因为未捕获的异常可能会导致PHP应用终止运行,显示错误信息。拦截并处理潜在异常的方式是,把可能抛出异常的代码放在在try/catch块中。

try {
    $pdo = new PDO("mysql://host=wrong_host;dbname=wrong_name");
} catch (PDOException $e) {
    $code = $e->getCode();
    $message = $e->getMessage();
    echo "Something went wrong.Check back soon, please";
    exit;
}

还可以连续抛出多个异常

try {
  throw new Exception("Not a PDO exception");
  $pdo = new PDO("mysql://host=wrong_host;dbname=wrong_name");
} catch (PDOException $e) {
    echo "Caught PDO exception";
} catch (Exception $e) {
    //处理其他异常
    echo "Caught generic exception";
} finally {
    //这里的代码始终都会执行
    echo "Always do this";
}

捕获某种异常的时候只会允许其中一个catch块,如果PHP没有找到适用的catch块,异常会向上冒泡,直到PHP脚本由于致命的错误而终止。
6).异常处理程序。我们可以使用一个全局的异常处理程序,来捕获所有未被捕获的异常。异常捕获程序都必须接受一个了类型为Exception的参数,异常捕获程序使用set_exception_handler()函数注册。


错误

1).我们可以使用error_reporting()函数或者在php.ini文件中使用error_reporting指令告诉PHP报告或者忽略那些错误。这两种都是使用E_*常量来确定。
2)错误报告方式四原则:

一定要让PHP报告错误

在开发环境中要显示错误

再生产环境中不能显示错误

在开发和生产环境中都要记录错误

3)一种php.ini配置的例子:
开发环境:

;显示错误
display_startup_errors = On
display_errors = On
;报告所有错误
error_reporting = -1
; 记录错误
log_errors = On

生产环境:

;不显示错误
display_startup_errors = Off
display_errors = Off
;除了注意事项外,报告所有错误
error_reporting = E_ALL & ~E_NOTICE
; 记录错误
log_errors = On

4).注册全局的错误处理程序:set_error_handler()函数。


5.一个简单的全局错误处理程序的例子:

set_error_handler(function($errno, $errstr, $errfile, $errline) {
   if (!(error_reporting() & $errno)) {
    //error_reporting指令没有设置这个错误,所以忽略
    return;  
  }
  throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
});

//其他代码

//还原成之前的错误处理程序
restore_error_handler();
相关处理组件

开发环境: filp/whoops

生产环境: monolog/monolog

专题系列

PHP专题系列目录地址:https://github.com/xx19941215/webBlog
PHP专题系列预计写二十篇左右,主要总结我们日常PHP开发中容易忽略的基础知识和现代PHP开发中关于规范、部署、优化的一些实战性建议,同时还有对Javascript语言特点的深入研究。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23331.html

相关文章

  • PHP异常的使用,异常子类化的最佳实践

    摘要:构造异常的子类。代码的逻辑功能部分如何使用异常的子类文件权限或文件不存在文件损坏错误的文件格式后备捕捉器,正常情况下不应该被调用。这样,可以在细化的子句中,针对不同的错误使用不同的恢复或失败机制。参考深入,面向对象模式与实践 构造异常的子类。 class XmlException extends Exception { private $error; func...

    李涛 评论0 收藏0
  • php资料集

    摘要:简单字符串缓存实战完整实战种设计模式设计模式是面向对象的最佳实践成为专业程序员路上用到的各种优秀资料神器及框架成为一名专业程序员的道路上,需要坚持练习学习与积累,技术方面既要有一定的广度,更要有自己的深度。 微型新闻系统的开发(PHP 5.4 + MySQL 5.5) 微型新闻系统的开发(PHP 5.4 + MySQL 5.5) 九个很有用的 PHP 代码 php 代码 国内值得关注的...

    RobinQu 评论0 收藏0
  • Spring 参数校验最佳实践(附完整实例)

    摘要:否则非法请求参数小则影响用户体验或者产生垃圾数据,大则会拖跨整个系统其次,手工对所有的参数进行校验相当繁琐,容易出错,而且最后,通过工具来完成其实是比较好的方式,但是必须让工具变得优雅一些。 声明:本文属原创文章,始发于公号:程序员自学之道,同步发布到 sf,转载请注明出处。 不够好的方案 在 Web 开发中, 我们经常需要校验各种参数,这是一件繁琐又重要的事情,对于很多人来说,在做参...

    tomlingtm 评论0 收藏0
  • PHP最佳实践多字节字符串、字符编码

    摘要:多字节字符串假设字符串中的每一个字符都是八位字符,占用一个字节的内存。如果使用原生的字符串函数处理这些多字节字符串,会得到意外的错误。字符编码一定要知道数据的字符编码。扩展不仅可以处理字符串,还可以在不同的字符编码之间转换多字节字符串。 多字节字符串 1).PHP假设字符串中的每一个字符都是八位字符,占用一个字节的内存。但是,你有可能会遇到多字节字符串。2).这里所说的多字节字符串是指...

    Cympros 评论0 收藏0
  • Java异常处理 10 个最佳实践

    摘要:为可恢复的错误使用检查型异常,为编程错误使用非检查型错误。检查型异常保证你对错误条件提供异常处理代码,这是一种从语言到强制你编写健壮的代码的一种方式,但同时会引入大量杂乱的代码并导致其不可读。在编程中选择检查型异常还是运行时异常。 异常处理是Java 开发中的一个重要部分。它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等。Java提供了...

    Forelax 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<