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


Posted in PHP onMay 25, 2020

本文实例讲述了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

...

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

实例

<?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()); 
?>

以上程序执行输出结果为:

Modulo by zero

PHP 7 异常

PHP 7 异常用于向下兼容及增强旧的assert()函数。它能在生产环境中实现零成本的断言,并且提供抛出自定义异常及错误的能力。

老版本的API出于兼容目的将继续被维护,assert()现在是一个语言结构,它允许第一个参数是一个表达式,而不仅仅是一个待计算的 string或一个待测试的boolean。

assert() 配置

配置项 默认值 可选值
zend.assertions 1 1 - 生成和执行代码 (开发模式) 0 - 生成代码,但在执行时跳过它 -1 - 不生成代码 (生产环境)
assert.exception 0 1 - 断言失败时抛出,可以抛出异常对象,如果没有提供异常,则抛出 AssertionError 对象实例。 0 - 使用或生成 Throwable, 仅仅是基于对象生成的警告而不是抛出对象(与 PHP 5 兼容)

参数

assertion

断言。在 PHP 5 中,是一个用于执行的字符串或者用于测试的布尔值。在 PHP 7 中,可以是一个返回任何值的表达式, 它将被执行结果用于指明断言是否成功。

description

如果 assertion 失败了,选项 description 将会包括在失败信息里。

exception

在 PHP 7 中,第二个参数可以是一个       Throwable 对象,而不是一个字符串,如果断言失败且启用了 assert.exception 该对象将被抛出。

实例

将 zend.assertions 设置为 0:

<?php 
ini_set('zend.assertions', 0); 
assert(true == false); 
echo 'Hi!'; 
?>

以上程序执行输出结果为:

Hi!

将 zend.assertions 设置为 1,assert.exception 设置为 1:

实例

<?php 
ini_set('zend.assertions', 1); 
ini_set('assert.exception', 1); 
assert(true == false); echo 'Hi!';
?>

以上程序执行输出结果为:

Fatal error: Uncaught AssertionError: 
assert(true == false) in -:2Stack trace:#0 -(2): 
assert(false, 'assert(true == ...')#1 {main} 
 thrown in - on line 2

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
粗略计算在线时间,bug:ip相同
Dec 09 PHP
Warning: session_destroy() : Trying to destroy uninitialized sessionq错误
Jun 16 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
Aug 16 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
May 10 PHP
PHP设计模式之适配器模式代码实例
May 11 PHP
PHP-FPM之Chroot执行环境详解
Aug 03 PHP
php二维码生成
Oct 19 PHP
thinkphp实现163、QQ邮箱收发邮件的方法
Dec 18 PHP
PHP中的表达式简述
May 29 PHP
[原创]PHP实现SQL语句格式化功能的方法
Jul 28 PHP
php实现对短信验证码发送次数的限制实例讲解
Mar 04 PHP
用php如何解决大文件分片上传问题
Jul 07 PHP
php7 list()、session及其他模块的修改实例分析
May 25 #PHP
php7 新增功能实例总结
May 25 #PHP
PHP强制转化的形式整理
May 22 #PHP
Yii 框架入口脚本示例分析
May 19 #PHP
Yii 框架使用数据库(databases)的方法示例
May 19 #PHP
PHP7生产环境队列Beanstalkd用法详解
May 19 #PHP
PHP项目多语言配置平台实现过程解析
May 18 #PHP
You might like
php&amp;mysql 日期操作小记
2012/02/27 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
php解决约瑟夫环算法实例分析
2019/09/30 PHP
Laravel框架源码解析之入口文件原理分析
2020/05/14 PHP
js模拟实现Array的sort方法
2007/12/11 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
2016/02/25 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
AngularJS中watch监听用法分析
2016/11/04 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
JavaScript代理模式原理与用法实例详解
2020/03/10 Javascript
基于JavaScript实现十五拼图代码实例
2020/04/26 Javascript
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
django如何连接已存在数据的数据库
2018/08/14 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
2019/09/02 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
AmazeUI 按钮交互的实现示例
2020/08/24 HTML / CSS
Linux的主要特性
2016/09/03 面试题
上学迟到的检讨书
2014/01/11 职场文书
学校党的群众路线教育实践活动总结报告
2014/07/03 职场文书
家长对孩子的寄语
2015/02/26 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
MySQL基于索引的压力测试的实现
2021/11/07 MySQL