php7 错误处理机制修改实例分析
本文实例讲述了php7 错误处理机制修改。分享给大家供大家参考,具体如下:
一、现在有两个异常类:Exception and Error.
PHP7现在有两个异常类,Exception and Error。这两个类都实现了一个新的接口:Throwable。在您的异常处理代码中,类型暗示可能需要调整下。
二、一些致命错误和可恢复致命错误改为抛出Error对象。
有一些致命错误和可恢复致命错误现在改为报出Error对象。Error对象是和Exception独立的,它们无法被常规的try/catch扑获。编者按:需要注册错误处理函数,请参考下面的RFC。
对于这些已经转为异常的可恢复致命错误,已经无法通过error handler静默的忽略掉。尤其是无法忽略类型暗示错误。
三、语法错误会抛出一个ParseError对象
语法错误会抛出一个ParseError对象,该对象继承自Error对象。之前处理eval()的时候,对于潜在可能错误的代码除了检查返回值或者error_get_last()之外,还应该捕获ParseError对象。
四、内部对象的构造方法如果失败的时候总会抛出异常
内部对象的构造方法如果失败的时候总会报出异常。之前的有一些构造方法会返回NULL或者一个无法使用的对象。
五、一些E_STRICT错误的级别调整了。
PHP 7 错误处理
PHP 7 改变了大多数错误的报告方式。不同于 PHP 5 的传统错误报告机制,现在大多数错误被作为 Error 异常抛出。
这种 Error 异常可以像普通异常一样被 try / catch 块所捕获。如果没有匹配的 try / catch 块, 则调用异常处理函数(由 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。
Error 类并不是从 Exception 类 扩展出来的,所以用 catch (Exception $e) { ... } 这样的代码是捕获不 到 Error 的。你可以用 catch (Error $e) { ... } 这样的代码,或者通过注册异常处理函数( set_exception_handler())来捕获 Error。
Error 异常层次结构
1.Error
-
ArithmeticError
-
AssertionError
-
DivisionByZeroError
-
ParseError
-
TypeError
2.Exception
...
实例
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php c lass MathOperations { protected $n = 10; // 求余数运算,除数为 0,抛出异常 public function doOperation(): string { try { $value = $this ->n % 0; return $value ; } catch (DivisionByZeroError $e ) { return $e ->getMessage(); } } } $mathOperationsObj = new MathOperations(); print ( $mathOperationsObj ->doOperation()); ?> |
以上程序执行输出结果为:
?1 | Modulo by zero |
PHP 7 异常
PHP 7 异常用于向下兼容及增强旧的assert()函数。它能在生产环境中实现零成本的断言,并且提供抛出自定义异常及错误的能力。
老版本的API出于兼容目的将继续被维护,assert()现在是一个语言结构,它允许第一个参数是一个表达式,而不仅仅是一个待计算的 string或一个待测试的boolean。
assert() 配置
配置项 | 默认值 | 可选值 |
zend.assertions | 1 |
|
assert.exception | 0 |
|
参数
assertion
断言。在 PHP 5 中,是一个用于执行的字符串或者用于测试的布尔值。在 PHP 7 中,可以是一个返回任何值的表达式, 它将被执行结果用于指明断言是否成功。
description
如果 assertion 失败了,选项 description 将会包括在失败信息里。
exception
在 PHP 7 中,第二个参数可以是一个 Throwable 对象,而不是一个字符串,如果断言失败且启用了 assert.exception 该对象将被抛出。
实例
将 zend.assertions 设置为 0:
?1 2 3 4 5 | <?php ini_set ( 'zend.assertions' , 0); assert(true == false); echo 'Hi!' ; ?> |
以上程序执行输出结果为:
Hi!
将 zend.assertions 设置为 1,assert.exception 设置为 1:
实例
?1 2 3 4 5 | <?php ini_set ( 'zend.assertions' , 1); ini_set ( 'assert.exception' , 1); assert(true == false); echo 'Hi!' ; ?> |
以上程序执行输出结果为:
?1 2 3 4 | Fatal error: Uncaught AssertionError: assert(true == false) in -:2Stack trace:#0 -(2): assert(false, 'assert(true == ...' )#1 {main} thrown in - on line 2 |
希望本文所述对大家PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/qq_42176520/article/details/87167630
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。