热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php7异常与错误处理和自定义异常

7.2版本异常与错误的概述什么叫做异常?异常是指程序运行中不符合预期情况以及与正常流程不同的状况。比如你链接数据库,在参数都写上去的条件下,发现链接不上去,这就属于不符合预期可以被

php7异常与错误处理和自定义异常

7.2版本异常与错误的概述

什么叫做异常?

异常是指程序运行中不符合预期情况以及与正常流程不同的状况。

比如你链接数据库,在参数都写上去的条件下,发现链接不上去,这就属于不符合预期

可以被 try-catch 捕捉得到

什么叫做错误?

是属于php程序自身的问题,一般是由非法的语法,环境问题导致的,使得编译器无法通过检查,甚至无法运行的情况。
平时遇到的 warming、notice都是错误,只是级别不同而已。

例如:

  • TypeError(类型错误) 我规定的函数参数类型和传入的参数不一致
  • ArithmeticError (算数错误)
  • ParseError (解析错误)在调入的文件中,include "demo.php",或者 eval();中有语法错误造成解析失败
  • AssertionError(断言错误)当assert生效时产生该错误
  • DivisionByZeroError (分母为零) 运算过程中例如除法,分母为0

除了这几种情况,其余全部为异常

异常处理

在以前的 php5.X 中 并且不能被 try-catch 捕捉得到,到了 php 7.x 中,定义了一个 Throwable 接口 并使得大部分的 Error 和
Exception 实现了该接口,我们得以在 try-catch 中抛出该错误

所以说以后想要捕获异常,而你又不知道此异常是 Error 还是 Exception 的话,可以向这样抛出

try{ …… }catch(Throwable $e){ …… }

错误的级别

在 php 中的错误也是有级别的

Parse error >Fatal Error > Waning > Notice > Deprecated

Deprecated 最低级别的错误(不推荐,不建议) 使用一些过期函数的时候会出现,程序继续执行 Notice 通知级别的错误 使用一些未定义变量、常量或者数组key没有加引号的时候会出现,程序继续执行 E_NOTICE // 运行时通知。表示脚本遇到可能会表现为错误的情况. E_USER_NOTICE // 用户产生的通知信息。 Waning 警告级别的错误 程序出问题了,需要修改代码!!!程序继续执行 E_WARNING // 运行时警告 (非致命错误)。 E_CORE_WARNING // PHP初始化启动过程中发生的警告 (非致命错误) 。 E_COMPILE_WARNING // 编译警告 E_USER_WARNING // 用户产生的警告信息 Fatal Error 错误级别的错误 程序直接报错,需要修改代码!!!中断程序执行,可使用register_shutdown_function()函数在程序终止前触发一个函数 E_ERROR // 致命的运行错误,错误无法恢复,暂停执行脚本 E_CORE_ERROR // PHP启动时初始化过程中的致命错误 E_COMPILE_ERROR // 编译时致命性错,就像由Zend脚本引擎生成了一个E_ERROR E_USER_ERROR // 自定义错误消息。像用PHP函数trigger_error(错误类型设置为:E_USER_ERROR) Parse error 语法解析错误 语法检查阶段报错,需要修改代码!!!中断程序执行,除了修改ini文件,将错误信息写到日志中,什么也做不了 E_PARSE //编译时的语法解析错误

自定义错误处理程序

有的时候,php 中自带的错误处理程序,并不能完全满足我们得需要,大部分时候,我们都需要手动重写异常处理。

php 给我们提供了三个函数来帮助我们来处理,分别是

set_error_handler()  

  • 函数来托管错误处理程序,可自行定制错误的处理流程。
  • 如果此函数之前的代码发生错误,那么不会调用我们自定义的处理函数,因为还未注册
  • 设置此函数后 error_reporting() 将会失效
  • 以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 该函数只能捕捉我们的 部分 Warning 和 Note 级别的错误

set_exception_handler() 

  • 用于没有被捕获的异常处理

register_shutdown_function()

  • 作用:注册一个会在php中止时执行的函数
  • 捕获PHP的错误:Fatal Error、Parse Error等,这个方法是PHP脚本执行结束前最后一个调用的函数,比如脚本错误、die()、exit、异常、正常结束都会调用,
  • 如果拿来用错误处理的时候,需要配合error_get_last() 它能获取最后发生的错误。
// 举例: register_shutdown_function("shutdown"); function shutdown() { if ($error = error_get_last()) { var_dump($error); } } $name //没写 ; 号

执行结果
Parse error: syntax error, unexpected ";" in /app/swoole/errorDemo.php on line 34
Emmmmm 这不扯淡吗? 分明分明没有执行呢?

其实原因使因为,程序执行前,我们 php 会先检查我们程序的语法问题,如果没有问题,我们才能执行我们的程序。

我们上面的代码没用通过我们的语法检查,所以直接报错。

那么问题来了? 我们在框架中的时候,为什么是框架都是框架给我们报错呢?

框架的错误处理

在框架中,其代码是通过一个入口文件来加载的。而我们php检测语法错误的时候,只检查我们的 index.php 有没有错误, require 文件中的代码是不会受到检测的。在Index.php 文件中通常会定义一些错误异常的处理。当我们代码出错时,那是在 run-time 中检测的错误,我们的框架可以根据我们编写的错误异常自行做出处理。

下面我们举个例子 在 ThinkPHP5中的异常处理

// [ 应用入口文件 ] index.php namespace think; // 加载基础文件 require __DIR__ . "/../thinkphp/base.php"; // 支持事先使用静态方法设置Request对象和Config对象 // 执行应用并响应 Container::get("app")->run()->send();

在我们的入口文件中,加载了 base.php 在这个文件中,TP 定义了自己的异常处理

// 载入Loader类 require __DIR__ . "/library/think/Loader.php"; // 注册自动加载 Loader::register(); // 注册错误和异常处理机制 Error::register(); // 实现日志接口 if (interface_exists("PsrLogLoggerInterface")) { //doSomething } // 注册类库别名 Loader::addClassAlias([ //doSomething ]); /** * 注册异常处理 * @access public * @return void */ public static function register() { error_reporting(E_ALL); set_error_handler([__CLASS__, "appError"]); set_exception_handler([__CLASS__, "appException"]); register_shutdown_function([__CLASS__, "appShutdown"]); }

可以看到 TP是在入口脚本就注册了 异常处理机制,分别把 Error 、Exception、Shutdown的处理都注册进来。后序所有的异常都不会走PHP原本的异常而是走 TP 自定义的异常。

 


推荐阅读
  • 本文详细介绍了如何在PHP中记录和管理行为日志,包括ThinkPHP框架中的日志记录方法、日志的用途、实现原理以及相关配置。 ... [详细]
  • 阿里云 Aliplayer高级功能介绍(八):安全播放
    如何保障视频内容的安全,不被盗链、非法下载和传播,阿里云视频点播已经有一套完善的机 ... [详细]
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 小程序的授权和登陆
    小程序的授权和登陆 ... [详细]
  • 本文介绍了Java编程语言的基础知识,包括其历史背景、主要特性以及如何安装和配置JDK。此外,还详细讲解了如何编写和运行第一个Java程序,并简要介绍了Eclipse集成开发环境的安装和使用。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • PHP 使用 Cookie 进行访问授权的方法
    本文介绍了如何使用 PHP 和 Cookie 实现访问授权,包括表单验证、数据库查询和会话管理等关键步骤。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • 本文详细介绍了如何在Linux系统(以CentOS为例)上彻底卸载Zimbra邮件系统,包括停止服务、删除文件和用户等步骤。 ... [详细]
  • Redis 脑裂现象及其应对策略
    本文探讨了 Redis 集群中的脑裂现象及其解决方案,包括脑裂的成因、影响以及如何通过配置项防止脑裂的发生。 ... [详细]
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
author-avatar
君字翔宇_323
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有