0

0

php7的错误与异常处理

齐天大圣

齐天大圣

发布时间:2020-08-12 10:41:07

|

2358人浏览过

|

来源于php中文网

原创

错误

错误是写程序中不可避免的,如何去发现定位错误及改正更是一门学问。今天和大家聊聊php7之后的错误与异常。

错误的分类

一般错误分为语法错误、运行时错误、逻辑错误。语法以及运行时错误很容易去排查,但逻辑错误就不是那么简单的了。鄙人在判断的时候也有多次将比较运算==写成了赋值运算=,像我这种就很难去发现。一般随着经验的丰富(踩坑踩多了),会越来越容易来找到逻辑错误。

控制错误的输出

一般建议开发阶段开启错误输出方便及时发现错误,上线阶段为了安全性及美观建议关闭错误输出。

php提供了一个参数display_errors用于控制错误向浏览器、cli的输出。有两种方式可以来修改它,通过修改php.ini文件或使用ini_set函数来设置。下面展示使用ini_set来设置屏蔽错误输出的代码。

该程序会正常输出01,但不会输出错误信息。

立即学习PHP免费学习笔记(深入)”;

错误报告级别

一般分为4大类

  • parse语法错误

  • error致命错误

  • warning警告级别错误

  • notice注意级别错误

在php.ini配置文件中,有选项error_reporting,该选项用来控制输出何种级别的错误。常见的有E_ALL、E_WARNING、E_NOTICE。

可以通过函数error_reporting()来动态控制错误级别的输出。

# 输出所有级别错误
error_reporting(E_ALL);
# 输出所有级别除了E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);
# 输出所有级别除了E_NOTICE和E_WARNING
error_reporting(E_ALL & ~(E_NOTICE | E_WARNING));

display_errors与error_reporting的区别

display_errors是用来控制错误是否输出,而error_reporting是用来控制输出何种级别的错误。通常他们会搭配使用

ini_set('display_errors', 0); // 关闭错误输出
error_reporting(E_ALL);  // 输出所有级别的错误信息

上面的配置一般是上线阶段,屏蔽所有的错误输出,但是记录错误到php的错误日志里。错误日志的路径是由选项error_log 决定的。

如果设置error_reporting为0值,则不输出错误也不记录错误日志。

错误对于程序的影响

当程序有语法错误时,程序是不会执行的。当有error级别的错误时,程序就会停止向下执行。notice、及warning级别错误时不会影响程序的向下执行的。

error_reporting(E_ALL);  // 输出所有级别的错误信息

echo $a;
echo 0;
date();
echo 1;
new a;
echo 2;

该程序会输出0和1,但不会输出2。

用户自定义错误

trigger_error()函数可以生产一个用户级别的错误。错误级别有E_USER_ERROR 、E_USER_WARNING、E_USER_NOTICE 等

成新网络商城购物系统
成新网络商城购物系统

使用模板与程序分离的方式构建,依靠专门设计的数据库操作类实现数据库存取,具有专有错误处理模块,通过 Email 实时报告数据库错误,除具有满足购物需要的全部功能外,成新商城购物系统还对购物系统体系做了丰富的扩展,全新设计的搜索功能,自定义成新商城购物系统代码功能代码已经全面优化,杜绝SQL注入漏洞前台测试用户名:admin密码:admin888后台管理员名:admin密码:admin888

下载

自定义错误处理

set_error_handler — 设置用户自定义的错误处理函数,该函数原型如下:

set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed

该函数首个参数是一个回调函数,原型如下:

handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ) : bool
  • error 错误级别

  • errstr 错误信息

  • errfile 发送错误的文件

  • errline 错误出现的行号

以下级别的错误不能由用户定义的函数来处理:    E_ERROR、 E_PARSE、    E_CORE_ERROR、 E_CORE_WARNING、    E_COMPILE_ERROR、    E_COMPILE_WARNING,和在调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。

异常

异常和错误时有区别的,错误一般是指我们能控制的问题,比如变量名写错了,或者判断条件写的不错,导致死循环。而异常通常指那些难以控制的、意料外的错误,比如mysql连接不上,文件句柄打开失败等情况。

php的异常也是经典的try catch finally,但和一般的异常处理不一样的是,绝大部分的异常需要自行抛出。抛出异常使用throw关键字完成。php也支持捕获多个异常。

printErr();
} catch (YourError $e) {
    $e->printErr();
} finally {
    echo '不管有没有异常,我都会被执行'.PHP_EOL;
}

php的异常如果没有捕获,则会报Fatal Error错误,程序不会继续向下执行。

PHP 7 错误处理

PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。 Error 和 Exception 都实现了 Throwable 接口

异常处理

设置默认的异常处理程序,有try/catch捕获的话这个异常函数就不会执行,反之就会执行异常处理函数,而且执行的话,脚本将不会继续执行。

php使用set_exception_handler来设置用户自定义的异常处理函数   ,函数原型如下:

set_exception_handler ( callable $exception_handler ) : callable

回调函数的原型如下:

handler ( Throwable $ex ) : void

下面,我们来写一个异常处理函数

printErr();
} catch (YourError $e) {
    $e->printErr();
} finally {
    echo '不管有没有异常,我都会被执行'.PHP_EOL;
}

统一处理错误与异常

学完了错误与异常,知道如何去使用自定义错误处理和异常处理,现在我们就可以统一处理错误与异常了。

 $errFile, 'level' => $errLevel, 'line' => $errLine, 'info' => $errInfo]);
    }
 
    // 处理致命错误及异常
    static function exceptionHandle(Throwable $ex)
    {
        echo '异常:'.PHP_EOL;
        print_r(['file' => $ex->getFile(), 'level' => $ex->getCode(), 'line' => $ex->getLine(), 'info' => $ex->getMessage()]);
    }
}
 
set_error_handler(['Errors', 'errorHandle']);
set_exception_handler(['Errors', 'exceptionHandle']);

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

0

2026.01.20

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

20

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

62

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

xml格式相关教程
xml格式相关教程

本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

19

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

160

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
基于PHP7+MVC博客系统设计
基于PHP7+MVC博客系统设计

共473课时 | 61.1万人学习

php7实战开发cms内容管理系统
php7实战开发cms内容管理系统

共15课时 | 6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号