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 相关文章推荐
php mssql 数据库分页SQL语句
Dec 16 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
Dec 07 PHP
基于php伪静态的实现详细介绍
Apr 28 PHP
Yii Framework框架获取分类下面的所有子类方法
Jun 20 PHP
thinkphp学习笔记之多表查询
Jul 28 PHP
php将一维数组转换为每3个连续值组成的二维数组
May 06 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
Mar 06 PHP
分享5个非常有用的Laravel Blade指令
May 30 PHP
PHP后台实现微信小程序登录
Aug 03 PHP
PHP PDOStatement::fetchObject讲解
Feb 01 PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
Dec 12 PHP
PHP实现腾讯短网址生成api接口实例
Dec 08 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中将网址转换为超链接的函数
2011/09/02 PHP
php中Y2K38的漏洞解决方法实例分析
2014/09/22 PHP
thinkPHP实现瀑布流的方法
2014/11/29 PHP
php生成动态验证码gif图片
2015/10/19 PHP
12款经典的白富美型—jquery图片轮播插件—前端开发必备
2013/01/08 Javascript
javascript中的throttle和debounce浅析
2014/06/06 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
jQuery实现背景弹性滚动的导航效果
2016/06/01 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
Cpage.js给组件绑定事件的实现代码
2017/08/31 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
ES6中Promise的使用方法实例总结
2020/02/18 Javascript
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
python中常用的九种预处理方法分享
2016/09/11 Python
Python实现邮件的批量发送的示例代码
2018/01/23 Python
Python zip()函数用法实例分析
2018/03/17 Python
详谈Pandas中iloc和loc以及ix的区别
2018/06/08 Python
Python干货:分享Python绘制六种可视化图表
2018/08/27 Python
使用Python求解带约束的最优化问题详解
2020/02/11 Python
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
金融专业应届生求职信
2013/11/02 职场文书
总经理职责范文
2013/11/08 职场文书
培训讲师岗位职责
2014/04/13 职场文书
环保倡议书50字
2014/05/15 职场文书
党员目标管理责任书
2014/07/25 职场文书
个人委托书范本
2014/09/13 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
消防演习通知
2015/04/25 职场文书
开业典礼致辞
2015/07/29 职场文书
校园文化艺术节开幕词
2016/03/04 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书