博客列表 >php7 错误处理机制修改实例分析

php7 错误处理机制修改实例分析

P粉823318658
P粉823318658原创
2022年03月23日 10:16:16600浏览
  1. 这篇文章主要介绍了php7 错误处理机制修改,结合实例形式分析了php7 错误处理机制修改相关原理、操作技巧与注意事项,需要的朋友可以参考下
  2. ``````php
  3. 本文实例讲述了php7 错误处理机制修改。分享给大家供大家参考,具体如下:
  4. 一、现在有两个异常类:Exception and Error.
  5. PHP7现在有两个异常类,Exception and Error。这两个类都实现了一个新的接口:Throwable。在您的异常处理代码中,类型暗示可能需要调整下。
  6. 二、一些致命错误和可恢复致命错误改为抛出Error对象。
  7. 有一些致命错误和可恢复致命错误现在改为报出Error对象。Error对象是和Exception独立的,它们无法被常规的try/catch扑获。编者按:需要注册错误处理函数,请参考下面的RFC
  8. 对于这些已经转为异常的可恢复致命错误,已经无法通过error handler静默的忽略掉。尤其是无法忽略类型暗示错误。
  9. 三、语法错误会抛出一个ParseError对象
  10. 语法错误会抛出一个ParseError对象,该对象继承自Error对象。之前处理eval()的时候,对于潜在可能错误的代码除了检查返回值或者error_get_last()之外,还应该捕获ParseError对象。
  11. 四、内部对象的构造方法如果失败的时候总会抛出异常
  12. 内部对象的构造方法如果失败的时候总会报出异常。之前的有一些构造方法会返回NULL或者一个无法使用的对象。
  13. 五、一些E_STRICT错误的级别调整了。
  14. PHP 7 错误处理
  15. PHP 7 改变了大多数错误的报告方式。不同于 PHP 5 的传统错误报告机制,现在大多数错误被作为 Error 异常抛出。
  16. 这种 Error 异常可以像普通异常一样被 try / catch 块所捕获。如果没有匹配的 try / catch 块, 则调用异常处理函数(由 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。
  1. Error 类并不是从 Exception 扩展出来的,所以用 catch (Exception $e) { ... } 这样的代码是捕获不 Error 的。你可以用 catch (Error $e) { ... } 这样的代码,或者通过注册异常处理函数( set_exception_handler())来捕获 Error
  2. ```php
  3. Error 异常层次结构
  4. 1.Error
  5. ArithmeticError
  6. AssertionError
  7. DivisionByZeroError
  8. ParseError
  9. TypeError
  10. 2.Exception
  1. ...
  2. 1458887252-2773-exception-hiearchy.jpg
  3. 实例
  1. <?php c
  2. lass MathOperations {
  3. protected $n = 10; // 求余数运算,除数为 0,抛出异常
  4. public function doOperation(): string {
  5. try {
  6. $value = $this->n % 0;
  7. return $value;
  8. } catch (DivisionByZeroError $e) {
  9. return $e->getMessage();
  10. }
  11. } }
  12. $mathOperationsObj = new MathOperations();
  13. print($mathOperationsObj->doOperation());
  14. ?>
  1. 以上程序执行输出结果为:
  2. 1
  3. Modulo by zero
  1. PHP 7 异常
  2. PHP 7 异常用于向下兼容及增强旧的assert()函数。它能在生产环境中实现零成本的断言,并且提供抛出自定义异常及错误的能力。
  3. 老版本的API出于兼容目的将继续被维护,assert()现在是一个语言结构,它允许第一个参数是一个表达式,而不仅仅是一个待计算的 string或一个待测试的boolean
  4. assert() 配置
  5. 配置项 默认值 可选值
  6. zend.assertions 1
  7. 1 - 生成和执行代码 (开发模式)
  8. 0 - 生成代码,但在执行时跳过它
  9. -1 - 不生成代码 (生产环境)
  10. assert.exception 0
  11. 1 - 断言失败时抛出,可以抛出异常对象,如果没有提供异常,则抛出 AssertionError 对象实例。
  12. 0 - 使用或生成 Throwable, 仅仅是基于对象生成的警告而不是抛出对象(与 PHP 5 兼容)
  13. 参数
  14. assertion
  15. 断言。在 PHP 5 中,是一个用于执行的字符串或者用于测试的布尔值。在 PHP 7 中,可以是一个返回任何值的表达式, 它将被执行结果用于指明断言是否成功。
  16. description
  17. 如果 assertion 失败了,选项 description 将会包括在失败信息里。
  18. exception
  19. PHP 7 中,第二个参数可以是一个 Throwable 对象,而不是一个字符串,如果断言失败且启用了 assert.exception 该对象将被抛出。
  20. 实例
  21. zend.assertions 设置为 0
  1. <?php
  2. ini_set('zend.assertions', 0);
  3. assert(true == false);
  4. echo 'Hi!';
  5. ?>
  1. 以上程序执行输出结果为:
  2. Hi!
  3. zend.assertions 设置为 1assert.exception 设置为 1
  4. 实例
  5. ```php
  6. 1
  7. 2
  8. 3
  9. 4
  10. 5
  11. <?php
  12. ini_set('zend.assertions', 1);
  13. ini_set('assert.exception', 1);
  14. assert(true == false); echo 'Hi!';
  15. ?>
  1. ```php
  2. 以上程序执行输出结果为:
  1. 1
  2. 2
  3. 3
  4. 4
  5. Fatal error: Uncaught AssertionError:
  6. assert(true == false) in -:2Stack trace:#0 -(2):
  7. assert(false, 'assert(true == ...')#1 {main}
  8. thrown in - on line 2
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议