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

...

实例

<?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字符串(string)用法总结》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

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

(0)

相关推荐

  • php7 参数、整形及字符串处理机制修改实例分析

    本文实例讲述了php7 参数.整形及字符串处理机制修改.分享给大家供大家参考,具体如下: 参数处理机制修改 一.重复参数命名不再支持. 重复的参数命名不再支持.比如下面的代码执行的时候会报错: public function foo($a, $b, $unused, $unused) { // ... } 编者按:应该没有人这样用吧. 二.func_get_arg和func_get_args()调整 func_get_arg()和func_get_args()这两个方法返回参数当前的值,而不是传

  • php7新特性的理解和比较总结

    1. null合并运算符(??) 语法: 如果变量存在且值不为NULL,它就会返回自身的值,否则返回它的第二个操作数. //php7以前 if判断 if(empty($_GET['param'])) { $param = 1; }else{ $param = $_GET['param']; } //php7以前 三元运算符 $param = empty($_GET['param']) ? 1 : $_GET['param']; //PHP7 null合并运算符 $param = $_GET['p

  • 浅谈php7的重大新特性

    截止到目前为止,PHP官方已经发布了php7的RC5版本,预计在11月份左右会发布第一个正式版本!现在来说php7的重大特性肯定已经是定型了,不会再有什么变动了.后续一些版本的迭代主要也就是修修bug,优化之类的.下面就来说话我们一直期待的php7会有那些主要的变化了... 新特性预览 ZEND引擎升级到Zend Engine 3,也就是所谓的PHP NG 增加抽象语法树,使编译更加科学 64位的INT支持 统一的变量语法 原声的TLS - 对扩展开发有意义 一致性foreach循环的改进 新增

  • 简述PHP7.4 新特性和废弃的功能

    PHP7.4 新特性 PHP7.4 上月 28 号已经发布了.又带来了一些新特性.可以让我们的代码写的更少了. 1. 属性添加限定类型 <?php class User { public int $age; public string $name } $user = new User(); $user->age = 10; $user->name = "张三"; //error $user->age = "zhang";//需要传递int 2

  • php7函数,声明,返回值等新特性介绍

    使用 ... 运算符定义变长参数函数 (PHP 5 >= 5.6.0, PHP 7) 现在可以不依赖 func_get_args(), 使用 ... 运算符 来实现 变长参数函数. <?php function f($req, $opt = null, ...$params) { // $params 是一个包含了剩余参数的数组 printf('$req: %d; $opt: %d; number of params: %d'."\n", $req, $opt, count

  • php5.6.x到php7.0.x特性小结

    本文总结分析了php5.6.x到php7.0.x特性.分享给大家供大家参考,具体如下: php5.6.x到php7.0.x特性 1.标量类型声明 字符串(string), 整数 (int), 浮点数 (float), 布尔值 (bool),callable,array,self,Class/interface name 2.返回值类型声明 定义参数类型和返回值类型 function test(int $a):int{} 如果不按规定传参会返回异常 3.null合并运算符 null合并运算符 (?

  • 基于PHP7错误处理与异常处理方法(详解)

    PHP7错误处理 PHP 7 改变了大多数错误的报告方式.不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出. 这种 Error 异常可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获.如果没有匹配的 catch 块,则调用异常处理函数(事先通过 set_exception_handler() 注册)进行处理. 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error). Error 类并非继承自

  • php7 新增功能实例总结

    本文实例总结了php7 新增功能.分享给大家供大家参考,具体如下: 一.核心 增加了group use语法声明.RFC: https://wiki.php.net/rfc/group_use_declarations 增加了null合并运算符??.RFC: https://wiki.php.net/rfc/isset_ternary 64位PHP7字符串长度可以超过2^31次方字节. 增加了Closure::call()方法. 双引号字符串和heredocs里面支持使用\u{xxxxx}来声明u

  • PHP7新特性之抽象语法树(AST)带来的变化详解

    本文分析了PHP7新特性之抽象语法树(AST)带来的变化.分享给大家供大家参考,具体如下: 这里大部分内容参照 AST 的 RFC 文档而成:https://wiki.php.net/rfc/abstractsyntaxtree,为了易于理解从源文档中节选部分进行介绍. 本文并不会告诉你抽象语法树是什么,这需要你自己去了解,这里只是描述 AST 给 PHP 带来的一些变化. 新的执行过程 PHP7 的内核中有一个重要的变化是加入了 AST.在 PHP5中,从 php 脚本到 opcodes 的执

  • php7 list()、session及其他模块的修改实例分析

    本文实例讲述了php7 list().session及其他模块的修改.分享给大家供大家参考,具体如下: 一.list()不再按照相反的顺序赋值 list($array[], $array[], $array[]) = [1, 2, 3]; var_dump($array); 上面的代码会返回一个数组:$array == [1, 2, 3] 而不是之前的 [3, 2, 1] 注意:只是赋值的顺序发生变化,赋的值还是和原来一样的. list($a, $b, $c) = [1, 2, 3]; // $

  • 升级 PHP7.1 后 openssl 解密 mcrypt AES 数据不兼容问题的处理方法

    这是一个创建于 374 天前的主题,其中的信息可能已经有所发展或是发生改变. $key = "01234567891234560123456789123456"; $iv = "0123456789123456"; //原本的 mcrypt 加密 $en_data = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, "0123456789123456", MCRYPT_MODE_CB

  • PHP7新特性foreach 修改示例介绍

    一.foreach()循环对数组内部指针不再起作用,在PHP7之前,当数组通过foreach迭代时,数组指针会移动.现在开始,不再如此,见下面代码.. $array = [0, 1, 2]; foreach ($array as &$val) { var_dump(current($array)); } PHP5运行的结果会打印int(1) int(2) bool(false) PHP7运行的结果会打印三次int(0),也就是说数组的内部指针并没有改变. 之前运行的结果会打印int(1), in

随机推荐