1 系统函数引发TypeError和ValueError异常

一.TypeError和ValueError改进作用

#在PHP 8中,内部函数参数强制执行类型和值验证,如果不允许使用预期的类型或值,则将抛出TypeError或ValueError异常错误.

#在PHP 8之前,这会导致PHP警告.

1.TypeError触发条件

提供的值是不是正确的类型.

2.ValueError触发条件

如果提供的值是正确的类型,但PHP在上下文中不可接受,则PHP会引发ValueError异常.

二.系统函数引发TypeError

substr('foo', []);try{ substr('linux',[]);}catch(TypeError $e){ echo $e->getMessage();}

三.系统函数引发ValueError

json_decode('"foo"', true, -1);try{ json_decode('"foo"', true, -1);}catch(ValueError $e){ echo $e->getMessage();}

四.自定义函数引发TypeError

function show(string $name){ var_dump($name);}show([]);

五.自定义函数引发ValueError

function show(int $number){ if($number<10){ throw new ValueError('this value must be greater or equal 10'); }else{ echo $number; }}show(5);#try捕捉function show(int $number){ if($number<10){ throw new ValueError('the number must be greater and equal 10'); }else{ echo $number; }}try{ show(5);}catch(ValueError $e){ echo $e->getMessage();}2 Throw表达式抛出异常

一.改进原因

在PHP8前,不允许在单个表达式时引发异常,现在可以在箭头函数、三元表达式等单个表达式的任何地方引发异常.

二.箭头函数使用

//第1阶段

function show(){ return 123;}echo show();// 第2阶段$fn=function(){ return 123;};echo $fn();//第3阶段echo (function(){ return 123;})();// 第4阶段$fn=fn()=>123;echo $fn();// 第5阶段echo (fn()=>123)();

三.箭头函数+引发异常

1.先定义后执行

$fn=fn()=>throw new Exception('error');try{ $fn();}catch(Exception $e){ echo $e->getMessage();}

2.定义并同时执行

(fn() => throw new Exception('oops'))();

四.三元表达式使用

$name=false;$age=20;$r=$name ? $name : $age;$r=$name ?: $age;$r=$name ?? $age;var_dump($r);

五.三元表达式+引发异常

#前面为真则返回第二个值,否则返回第三个值

$value = $name ? $name : throw new Exception('value not set');$value = $name ?: throw new Exception('value not set');

#前面存在则返回第一个值,否则返回第二个值

$value = $name ?? throw new Exception('value not set');

3 无变量捕获的Catch

一.作用

在catch读法中不用必须写$e变量

二.语法

try{ ...}catch(Exception){ ...}

三.实例

try{ (fn()=>throw new Exception('error'))();}catch(Exception){ echo 'Exception error!';}

4 默认错误报告设置为E_ALL

一.配置方法

#php.ini

error_reporting = E_ALL

二.恢复旧设置

#屏蔽已弃用错误、提示错误、语法严格性检测

E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE

三.屏蔽所有错误

display_errors = Off

四.配置生效

pkill -USR2 php-fpm

5 默认情况下显示PHP启动错误

#php.ini

一.默认PHP启动错误

display_startup_errors = On

二.测试PHP启动错误

1.制造启动错误

session.name=''

2.启动测试

pkill php-fpm/usr/local/php/sbin/php-fpm

三.屏蔽PHP启动错误

1.startup错误

display_startup_errors = Off

2.控制错误级别

error_reporting = E_ALL & ~E_WARNING

3.测试结果

pkill php-fpm/usr/local/php/sbin/php-fpm

4.商用建议关闭

6 Assert断言默认情况下引发异常

一.Assert改进

#php.ini默认开启

#assert(true === false);

1.低版本下失败的assert断言会引发警告,但不会引发异常.(PHP5)

assert.exception=On

2.php8开始失败的assert断言会直接引发异常.(PHP7,PHP8)

assert.exception=On

二.Assert回调

1.display_errors = Off

2.assert.callback = assert_fail

3.回调实验

assert(5<10);function assert_fail($file,$line,$assertion,$description){ echo $file; echo '

'; echo $line; echo '

'; echo $description;}

7 操作符@不再抑制Fatal错误

一.新版本中@不再抑制Fatal错误

1.实例1

@substr();

2.实例2

function load_files() { require_once 'file-that-does-not-exist.oops';}@load_files();

3.在PHP 8.0中,该@运算符不会抑制在PHP 8.0之前已静音的某些类型的错误

E_ERROR -致命的运行时错误.E_CORE_ERROR -PHP的初始启动中发生致命错误.E_COMPILE_ERROR -致命的编译时错误.E_USER_ERROR-用户触发的trigger_error()功能错误.E_RECOVERABLE_ERROR -可捕获的致命错误.E_PARSE -编译时解析错误.

4.E_USER_ERROR实例

function do_something() { trigger_error('Something went wrong', E_USER_ERROR);}@do_something();

8 PDO默认错误模式为ERRMODE_EXCEPTION

一.创建sqlite3数据库php8.db

sqlite3 /sqlite3/php8.db

二.sql基础操作

1.创建表user

create table user(id integer PRIMARY KEY AUTOINCREMENT,name text,age integer);

2.插入数据

insert into user values(1,'user1',20);insert into user values(2,'user2',22);

3.查询数据

select * from user;

三.linux下查看数据库文件(十六进制)

xxd php8.db

四.php pdo操作sqlite3 php8数据库

$pdo = new PDO('sqlite:/sqlite3/php8.db');

五.pdo报错类型PDO::ATTR_ERRMODE

1.PDO::ERRMODE_SILENT 02.PDO::ERRMODE_WARNING 13.PDO::ERRMODE_EXCEPTION 2

六.pdo设置错误类型

1.设置

$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);

2.获取

$pdo->getAttribute(PDO::ATTR_ERRMODE);

七.pdo操作user表

$sql='select * from user2';$smt=$pdo->prepare($sql);$smt->execute();$arr=$smt->fetchAll(PDO::FETCH_ASSOC);

八.pdo操作异常捕捉

try{ $pdo=new PDO('sqlite:/sqlite3/php8.db'); $smt=$pdo->prepare('select * from user2'); $smt->execute(); $rows=$smt->fetchAll(PDO::FETCH_ASSOC);}catch(PDOException $e){ echo $e->getMessage();}

php asserttrue,PHP8.0的新特性:错误处理方面已经改进相关推荐

  1. PHP8.0的新特性

    PHP 8.0 是 PHP 语言的一个主版本更新. 它包含了很多新功能与优化项, 包括命名参数.联合类型.注解.构造器属性提升.match 表达式.nullsafe 运算符.JIT,并改进了类型系统. ...

  2. .NET Framework 4.0的新特性

    本文将揭示.NET 4.0中的3个新特性:图表控件.SEO支持以及ASP.NET 4可扩展的输出缓存. 图表控件 微软向开发者提供了大量可免费下载的图表控件,可以在.NET 3.5 ASP.NET或W ...

  3. mysql 5.0 php_PHP 5.0的新特性

    PHP 5.0的新特性 最近,读者可以从PHP 4.x版本转移到PHP 5.0版本.正如读者期望的那样,在一个新的主要版本中,它做出了一些重要变更.在这个版本中,PHP后台的Zend引擎经过了完全的重 ...

  4. Tensorflow 2.0的新特性

    Tensorflow 2.0的新特性 几天前,Tensorflow刚度过自己的3岁生日,作为当前最受欢迎的机器学习框架,Tensorflow在这个宝座上已经盘踞了近三年.无论是成熟的Keras,还是风 ...

  5. jdk5.0的新特性

    jdk的版本在1.4后变化很大,所以叫jdk5.0 下面是总结jdk5.0的新特性: (1)泛型(***)  泛型简介 泛型是J2SE 5.0最重要的特性.他们让你写一个type(类或接口)和创建一个 ...

  6. ASP.NET MVC 3.0(一): MVC 3.0 的新特性 摘要

    ASP.NET MVC 3.0(一): MVC 3.0 的新特性 摘要 ASP.NET MVC 3.0(二): MVC的概念及MVC 3.0开发环境 ASP.NET MVC 3.0(三): 初识MVC ...

  7. Android O(SDK 8.0)新特性,刘海屏

    > Android刘海屏 Android 屏幕,16:9,17:9,19:10,18:9,18.5:9所谓全面屏.挖孔屏.凹凸屏等. android 全面屏/刘海屏有效适配- https://b ...

  8. PHP7.0 的新特性

    PHP7.0 的新特性经常会被面试官问到,在平时的项目开发中运用它们也会提升一定的代码质量和代码运行性能,可见这个知识点的重要性.不过有很多人都没有去系统的了解掌握,今天我刚好系统整理了一番分享出来. ...

  9. Spark 3.2.0 版本新特性 push-based shuffle 论文详解(一)概要和介绍

    前言 本文隶属于专栏<大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 目录 Spark 3.2.0 ...

最新文章

  1. 使用Leangoo管理产品Backlog
  2. Linux命令:dd、iostat、sar
  3. .NET 6 新特性 Parallel ForEachAsync
  4. Luogu P3975 [TJOI2015]弦论
  5. Audirvana for Mac(高品质音乐播放器)
  6. python编程入门必备知识-Python快速编程入门,打牢基础必须知道的11个知识点
  7. [转载] 使用 Python 实现鼠标键盘自动化
  8. 【Energy Forecasting】能源预測的发展和展望
  9. 股票数据下载-如何下载股票历史行情数据?
  10. 解决VS2015无法打开WinSock2.h,无法找到ws2_32.lib
  11. 盛夏光年 - 江湖一剑客
  12. 瑞利分布(Rayleigh Distribution)回顾
  13. 做PPT只会用黑体和宋体?这些可商用字体瞬间提升你的PPT档次
  14. 植物大战僵尸CE教程
  15. 制作一个带rEFInd引导菜单的WinPE启动光盘
  16. 可穿戴在线展首日巡礼:剖析产业痛点 直击黑科技新品
  17. 【DIY娱乐】手机链接PC玩体感游戏
  18. 前端学习 星星评分的设计。
  19. 【打卡功能实现思路】
  20. 【BLE】CC2541之SNV

热门文章

  1. Java ClassLoader getSystemResource()方法与示例
  2. 顶级Javaer,常用的 14 个类库
  3. 复盘线上的一次OOM和性能优化!
  4. 面试官:如何实现幂等性校验?
  5. Windows10 64位 安装 Postgresql 数据库
  6. c++设计新思维_贵阳花溪区初三冲刺多少钱,新思维
  7. anaconda中tensorflow-estimator版本应与tensorflow-gpu版本相同
  8. java中trim_java中string.trim()函数的作用实例及源码
  9. linux用户的配置文件保存在哪里,使用配置文件(.settings、.config)存储应用程序配置...
  10. x5内核有什么优点_接上U盘就是NAS私有云,蒲公英X5入手测评