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配置心得包含MYSQL5乱码解决
Nov 20 PHP
深入解析php模板技术原理【一】
Jan 10 PHP
php 缓存函数代码
Aug 27 PHP
php批量更改数据库表前缀实现方法
Oct 26 PHP
php引用传值实例详解学习
Nov 06 PHP
php实现mysql封装类示例
May 07 PHP
PHP函数实现分页含文本分页和数字分页
Oct 23 PHP
php数组索引与键值操作技巧实例分析
Jun 24 PHP
WordPress中获取所使用的模板的页面ID的简单方法
Dec 31 PHP
浅析Yii2缓存的使用
May 10 PHP
老生常谈文本文件和二进制文件的区别
Feb 27 PHP
PHP 自动加载类原理与用法实例分析
Apr 14 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+MYSQL的文章管理系统(一)
2006/10/09 PHP
mysql时区问题
2008/03/26 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
PHP使用token防止表单重复提交的方法
2016/04/07 PHP
PHPExcel在linux环境下导出报500错误的解决方法
2017/01/26 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
jquery下jstree简单应用 - v1.0
2011/04/14 Javascript
Jquery Change与bind事件代码
2011/09/29 Javascript
基于jquery ajax 用户无刷新登录方法详解
2012/04/28 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
AngularJS基础 ng-value 指令简单示例
2016/08/03 Javascript
JS前向后瞻正则表达式定义与用法示例
2016/12/27 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
js获取当前周、上一周、下一周日期
2017/03/19 Javascript
Angular动态添加、删除输入框并计算值实例代码
2017/03/29 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
2017/12/21 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
python把数组中的数字每行打印3个并保存在文档中的方法
2018/07/17 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
Python 项目转化为so文件实例
2019/12/23 Python
Python计算IV值的示例讲解
2020/02/28 Python
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
销售文员岗位职责
2013/11/29 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书