PHP与MySQL程序设计 学习笔记 第八章 错误和异常处理

2023-11-06

error_reporting函数确定报告的敏感级别,共有16个不同级别,这些级别的任何组合都是有效的:
在这里插入图片描述
error_reporting函数使用~字符表示逻辑操作符NOT。

error_reporting(E_ALL & E_STRICT);    // 希望报告所有错误,php 5.4.0前E_ALL并不包含E_STRICT
error_reporting(E_ERROR | E_PARSE | E_CORE_ERROR);    // 只考虑运行时错误、编译解析错误、核心错误
error_reporting(E_ALL & ~E_USER_WARNING);    // 报告除E_USER_WARNING之外的所有错误
error_reporting(E_ALL ^ E_USER_WARNING);    // 同上
ini_set('error_reporting', E_ALL ^ E_USER_WARNING);    // 同上

返回当前的错误报告设置:

var_dump(error_reporting());    // 可将此函数结果与具体的常量相与查看是否开启了该常量对应的错误报告

启用display_errors指令时,将显示满足error_reporting所定义规则的所有错误。启用该指令:

ini_set('display_errors', true);

此设置应在测试时使用,投入网站时会将错误信息打印在网页上,可能会泄露服务器的信息。

php 5.2中引入了函数error_get_lsat,它会返回一个关联数组,包含最后出现的错误类型、消息、文件和行号:

error_reporting(E_ALL);
ini_set('display_errors', false);

class a {
    public function func() {
        print("in func");
    }
}

a::func();

print_r(error_get_last());

运行它:
在这里插入图片描述
显示php引擎初始化时遇到的所有错误,此指令也只应在测试时启用:

ini_set('display_startup_errors', true);

启用log_errors指令可将日志记录下来:

ini_set('error_reporting', E_NOTICE);    // 记录notice级别日志
ini_set('log_errors', true);    // 启用日志记录
ini_set('error_log', '日志路径');    // 设置日志路径

$arr = [];
$arr[1];

运行它什么也没有输出,接着查看日志:
在这里插入图片描述
如果日志文件指令error_log设置为系统日志后台程序,则在linux上错误将被送往syslog,windows上会被送往事件日志(相当于linux上的syslog)。这些系统日志提供了接口来记录系统和应用执行有关的消息。

设置日志行的最大长度(以字节为单位),默认1024字节,设为0表示不指定最大长度:

ini_set('log_errors_max_len', 1);

如果设为1,实际效果为:
在这里插入图片描述
只显示了U,实际完整的日志内容为:
在这里插入图片描述
忽略同一文件中同一行上发生的重复错误消息:

ini_set('ignore_repreated_errors', true);

忽略不同文件中或同一文件中不同行上重复的错误信息:

ini_set('ignore_repreated_source', '1');

将上次出现的错误消息存放到变量php_errormsg中:

ini_set('log_errors', true);
ini_set('error_log', 'C:\Users\X\Desktop\phpLog.txt');
ini_set('log_errors_max_len', 1);
ini_set('track_errors', '1');    // 如果此指令开启,则将上次出现的错误信息存在变量php_errormsg中

$arr = [];
$arr[1];

print("in var: " . $php_errormsg);

运行它:
在这里插入图片描述
如果在共享服务器上,错误日志可能只能记录在单独的文本文件或数据库表中;如果在独占服务器上,则可将错误日志记录在syslog中,这样可使用syslog提供的解析工具查看和分析日志。

如果使用syslog,可使用以下函数向syslog发送定制的消息:
1.初始化php的日志工具的函数,会初始化一些常量,这些常量是使用后面函数时必需的:
在这里插入图片描述
如果运行PHP 5.2或更早版本,运行下面日志函数时前需要先执行此函数。这个函数在php 6.3中被废弃,因为PHP 5.2之后的版本中调用openlog和syslog时会自动初始化。
2.打开与所在平台上系统日志器的连接,该函数是可选的,只有希望在日志消息前加一个预定义字符串时才有必要调用,否则可直接调用syslog:
在这里插入图片描述
参数:
(1)ident:每项消息开始处的消息标识符,通常设为程序名。
(2)option:见下表,多个选项间可用|连接:
在这里插入图片描述
(3)facility:可取值有LOG_KERN、LOG_USER、LOG_MAIL、LOG_DAEMON、LOG_AUTH、LOG_LPR、LOG_CORN、LOG_LOCALN(N为0~7的值),这些值确定了消息的目标,比如php可能通过crontab执行,可将该选项设为LOG_CORN,使后续的消息被发送到cron日志。一般此参数设为LOG_USER,消息会被发送到messages文件。
3.关闭由openlog函数打开的连接:
在这里插入图片描述
4.向日志发送消息:
在这里插入图片描述
第一个参数表示优先级,可以是以下值:
在这里插入图片描述
第二个参数为要记录的文本消息,如果希望记录由php引擎提供的错误消息,可在message中包含%m,它会被php引擎运行时提供的错误消息字符串strerror所代替。

使用以上函数:
在这里插入图片描述
会在messages syslog文件中生成以下日志:
在这里插入图片描述

php中类名、方法名是不区分大小写的:

class a {
    public function func() {
        print(1);
    }
}

$aObj = new A();
print($aObj->Func());

运行它:
在这里插入图片描述
基本异常类Exception包括一个默认构造函数:
在这里插入图片描述
还有一个接受三个可选参数的构造函数:
在这里插入图片描述
参数按从左到右位置顺序:
(1)message:作为对异常的解释。
(2)error code:用于保存错误标识符,可用于映射到某自定义标识符–消息表,通常用于国际化和本地化。
(3)previous:php 5.3.0新增,可用来传入导致抛出当前异常的异常,该特性称为异常串链,也称为异常嵌套。

异常类有以下方法:
1.getCode():返回传给构造函数的错误代码。
2.getFile():返回抛出异常的文件名。
3.getLine():返回抛出异常的行号。
4.getMessage():返回传递给构造函数的消息。
5.getPrevious():php 5.3.0中新增,返回前一个异常。
6.getTrace():返回一个数组,包含错误的上下文消息,包括文件名、行号、函数名、函数参数。
7.getTraceAsString():返回字符串版的6。

虽然可扩展异常类,但不能覆盖基类Exception中的任何方法,它们都是final的。

使用异常类:

try {
    $fh = fopen("afile", "r");
    if (!$fh) {
        throw new Exception("can't open file");    // new是必需的
    }
} catch(Exception $e) {
    print("Error (File: " . $e->getFile() . ", line " . $e->getLine() . "): " . $e->getMessage());
}

运行它:
在这里插入图片描述
扩展异常类:

class MyException extends Exception {
    public function __construct($msg) {
        parent::__construct($msg);
        print("in my exception class\n");
    }
}

try {
    throw new MyException("can't open file");
} catch(Exception $e) {
    print("Error (File: " . $e->getFile() . ", line " . $e->getLine() . "): " . $e->getMessage());
} catch(MyException $e) {
    print("MyException caught");
}

运行它:
在这里插入图片描述
而如果把上例中的两个catch语句调换位置:

<?php
class MyException extends Exception {
    public function __construct($msg) {
        parent::__construct($msg);
        print("in my exception class\n");
    }
}

try {
    throw new MyException("can't open file");
} catch(MyException $e) {
    print("MyException caught");
} catch(Exception $e) {
    print("Error (File: " . $e->getFile() . ", line " . $e->getLine() . "): " . $e->getMessage());
}

运行它:
在这里插入图片描述
这说明如果抛出的是A类的派生类B的异常对象,则catch语句中A类和B类都能捕获B类异常对象,哪个catch语句就进入哪个catch块。

SPL(Standard PHP Library,php标准库)扩展了php,其中预定义了13个异常:
1.BadFunctionCallException:如果调用了未定义的函数或调用函数时参数的个数不对可使用该类。
2.BadMethodCallException:如果调用了未定义的方法或调用方法时参数的个数不对可使用该类。
3.DomainException:当某个输入值超出范围时,可抛出该异常。
4.InvalidArgumentException:如果传入一个函数或方法的参数类型不兼容,可抛出该异常。
5.LengthException:当一个字符串的长度不合法时,可抛出该异常。
6.LogicException:是SPL异常扩展的两个基类之一,处理程序编写不正确的情况。
7.OutOfBoundsException:当提供的键与数组中所有键都不匹配时可使用。
8.OutOfRangeException:当一个函数的输出值超出一个预定义范围时,可抛出该异常。
9.OverflowException:当算数溢出或缓冲区上溢出时,可抛出该异常。
10.RangeException:DomainException的运行时版本。
11.RuntimeException:是SPL异常扩展的两个基类之一,处理只在运行时出现的问题。
12.UnderflowException:当算数溢出或缓冲区下溢出时,可抛出该异常。
13.UnexpectedValueException:当提供的值与预定义的值集不匹配时,可抛出该异常。

try {
    throw new RangeException("I'm RangeException");
} catch(Exception $e) {
    print("in Exception catch\n");
    print($e->getMessage());
} catch(RuntimeException $e) {
    print("in RuntimeException catch\n");
    print($e->getMessage());
} catch(RangeException $e) {
    print("in RangeException catch\n");
    print($e->getMessage());
}

运行它:
在这里插入图片描述
由此,SPL中扩展的异常类是基于Exception的。

而当去掉Exception的catch时,输出会变成:
在这里插入图片描述
RuntimeException是基于Exception的,而RangeException是基于RuntimeException的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP与MySQL程序设计 学习笔记 第八章 错误和异常处理 的相关文章

  • unity 游戏开发过程中需要注意和后期优化的重点方向和难点分析(大白话理论篇)

    开发游戏也有近3年时间了 自己是做app移动开发出身 可能入手unity开发手机游戏 算是有点小优势 毕竟起码开始就有点unity它是怎么一步步转化为一个用户用的app 在用unity做游戏的时候 自己也尝试过使用cocos2d x 感觉下
  • 使用 Docker 搭建你自己的 RSS 服务(FreshRSS)

    本文使用 署名 4 0 国际 CC BY 4 0 许可协议 欢迎转载 或重新修改使用 但需要注明来源 署名 4 0 国际 CC BY 4 0 本文作者 苏洋 创建时间 2019年01月05日 统计字数 1983字 阅读时间 4分钟阅读 本文
  • sys.path.insert()用法

    注 sys path模块是动态的修改系统路径 模块要处于Python搜索路径中的目录里才能被导入 但我们不喜欢维护一个永久性的大目录 因为其他所有的Python脚本和应用程序导入模块的时候性能都会被拖累 本节代码动态地在该路径中添加了一个
  • 循环动态渲染img标签

    img alt listInfo icon buKa png type 补卡 id 1 icon xiuJia png type 休假 id 2
  • VS工程的3个基本文件

    VS的工程根目录下有3个文件 这3个文件都可以用记事本打开 其中 1 MyTest sln 工程主文件 含属性设置 工程从该文件打开 工程的主要属性设置在该文件中 2 MyTest filters 工程目录结构筛选器 工程的目录结构保存在这
  • leetCode热题52-57 解题代码,调试代码和思路

    前言 本文属于特定的六道题目题解和调试代码 1 剑指 Offer 22 链表中倒数第k个节点 Easy 2022 09 01 91 2 76 最小覆盖子串 Hard 2023 03 27 82 3 165 比较版本号 Medium 2023
  • Me and My Girlfriend靶机渗透

    背景描述 这个VM告诉我们 有一对恋人 即Alice和Bob 这对夫妻本来很浪漫 但是自从Alice在一家私人公司 Ceban Corp 工作以来 爱丽丝对鲍勃的态度发生了一些变化是 隐藏的 而鲍勃 Bob 寻求您的帮助 以获取爱丽丝 Al
  • Python 第四章 字典:当索引不好用时

    字典 是Python中唯一内建的映射数据结构类型 这里的映射是指通过名字引用值 字典中的值并没有特殊的顺序 值都是存储在一个特定的键里 键可以是数字 字符串甚至是元祖 什么是键 什么是值 怎么映射呢 请继续看下去 创建和使用字典 下面来创建
  • ‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序

    运行 npm run serve 报以下错误 首先检查一下文件中是否有node modules文件夹 如果没有则执行以下代码 npm install 其中可能会有很多警告 不用搭理 如果文件中已经有node modules文件夹 那么先把n
  • 接口自动化测试总结

    前言 本文是我在公司总结的一点点个人建议 可能有非常多的遗漏 先记录下来这时候我的理解 公司是做共享单车业务的 所以场景基本上也可以复用 毕竟大家都骑过单车 注明 code是我司接口返回的标志 编写之前 接口相关 这块总结不全 了解接口的功
  • 【Springboot WebSocket STOMP使用 2】STOMP使用@SendToUser实现用户个人请求-响应

    背景 STOMP协议的模型是 订阅 发布 式的 所以一般场景是同一个主题的广播 而有些场景下用户既想保持当前的WebSocket Session复用 又想消息的响应只有我自己能收到 指定其他某一个用户也行 不过得用其他api方法 不需要别人
  • 九月十月百度人搜,阿里巴巴,腾讯华为笔试面试八十题(第331-410题)

    九月十月百度人搜 阿里巴巴 腾讯华为小米搜狗笔试面试八十题 引言 自发表上一篇文章至今 事实上 上篇文章更新了近3个月之久 blog已经停了3个多月 而在那之前 自开博以来的21个月每月都不曾断过 正如上一篇文章支持向量机通俗导论 理解SV
  • 嵌入式Linux下使用OpenCV

    By Toradex 秦海 1 简介 OpenCV的全称是Open Source Computer Vision Library 是一个跨平台的计算机视觉库 OpenCV是由英特尔公司发起并参与开发 以BSD许可证授权发行 可以在商业和研究
  • 机器学习之实战matlab神经网络工具箱

    上节在 机器学习之从logistic到神经网络算法 中 我们已经从原理上介绍了神经网络算法的来源与构造 并编程实战了简单神经网络对于线性与非线性数据的分类测试实验 看过上节的可能会发现 上节实现的算法对于非线性数据的分类效果并不是非常完美
  • Java并发编程系列8 - 多线程实战

    主要基于小米最近的多线程项目 抽离出里面的多线程实例 前言 Java多线程的学习 也有大半个月了 从开始学习Java多线程时 就给自己定了一个小目标 希望能写一个多线程的Demo 今天主要是兑现这个小目标 这个多线程的示例 其实是结合最近小

随机推荐

  • JVM_09 类加载与字节码技术(字节码指令2)

    1 条件判断指令 几点说明 byte short char 都会按 int 比较 因为操作数栈都是 4 字节 goto 用来进行跳转到指定行号的字节码 源码 public class Demo3 3 public static void m
  • ES 的聚合机制和模糊匹配

    一 Elasticsearch对于大数据量 上亿量级 的聚合如何实现 Elasticsearch 提供的首个近似聚合是cardinality 度量 它提供一个字段的基数 即该字段的distinct或者unique值的数目 它是基于HLL算法
  • node.js入门学习

    文章目录 一 第一个node js应用 二 node js文件系统 1 读取文件 2 写入文件 三 node js模块化 新建一个module1 js文件 在require js文件中引入module1 js文件 四 node js发起GE
  • 参考文献期刊首字大写_sci论文参考文献格式

    学术论文的写作都离不开参考文献的引用与借鉴 参考文献的引用与借鉴可以让我们的文章更具可读性 也更具权威性与科学性 所以学术界对参考文献的引用有着明确的格式要求 凡是引用他人的文献都要在文章中做相应标注 这对原作者来说也是一种权利的保护 参考
  • 【OLED驱动】:stm32F103的四线模拟IIC驱动的0.96寸OLED屏幕显示数字,字母,汉字,图片的例程

    文章目录 前言 一 四线OLED是什么 二 IIC原理 1 四线0 96寸OLED是IIC驱动来实现显示 2 IIC协议的OLED屏幕 3 STM32驱动代码 4 IIC使用代码 总结 前言 最近在做一个开源方案 平衡车 即将开源硬件和软件
  • C++报错不允许使用不完整的类型

    include pch h include
  • #define _CRT_SECURE_NO_WARNINGS 1问题

    文章目录 前言 一 为什么用了scanf strcyp strlen strcat等函数会报错 二 操作步骤 1 下载notepad 2 修改 总结 前言 当我们的代码出现这样的报错时 不要慌张 应该是你用了scanf strcyp str
  • Merkle Tree(默克尔树)算法解析

    Merkle Tree 默克尔树 算法解析 1 Merkle Tree概念 Merkle Tree 通常也被称作Hash Tree 顾名思义 就是存储hash值的一棵树 Merkle树的叶子是数据块 例如 文件或者文件的集合 的hash值
  • 记一次jvm项目调优

    问题描述 运维一直说 fy core 项目这个项目每天都会发生多次full gc full gc 会停顿600ms左右 理论上生产环境不允许发生full gc 所以决定把full gc都优化掉 以下是该grafana对应的资源表现 可以看出
  • react生命周期componentDidMount中设置setState在esIint报错

    react生命周期componentDidMount中设置setState在esIint报错 项目背景 由于需要在页面渲染出来的时 对state中的数据进行初始化并需要出发render重绘 componentDidMount let sel
  • 5G“邂逅”云计算,运营商云网融合大势所趋

    近几年 国内运营商纷纷发力布局云计算市场 力求在云领域打造出自己的地盘 近期 中国电信天翼云与中科曙光战略合作 双方将共同探索在 5G 云 领域的建设 去年8月中国移动在苏州成立中国移动云能力中心 中国联动也于去年年底发布沃云云计算战略 而
  • navicat使用触发器在插入记录修改某个字段的值

    最近项目遇到了一个问题 查用户的某些字段有NULL会报错 所以想在注册的时候用的触发器提前设置一个默认值 避免空指针 先在本地建一个测试表t 1 就给三个基本字段 然后右击表选择设计表找到 触发器 开始编辑 现在的写法是正确的 我之前是这样
  • B站马士兵python入门基础版详细笔记(4)

    前言 这篇文章是B站学习python入门基础班的视频的第四章内容 主要讲述的是if else语句 但是不包括循环结构 循环结构在下一章笔记中有记叙 一 顺序结构 什么是顺序结构呢 比如说 把大象装冰箱需要分几步 print 程序开始 pri
  • 数模比赛提分tips

    1 对于模型的建立和求解 这一部分是文章的重点 要特别突出你的创造性的工作 在这部分写作需要注意的事项有 一定要有分析 而且分析应在所建立模型的前面 一定要有明确的模型 不要让别人在你的文章中去找你的模型 关系式一定要明确 思路要清晰 易读
  • 指针进阶(三)

    指针进阶 三 指针习题组 01 int main int a 5 1 2 3 4 5 int ptr int a 1 printf d d a 1 ptr 1 return 0 运行结果 原因 这里a是数组名 存放的是数组的首地址 a是整个
  • pip install tensorflow报错ERROR: Could not find a version that satisfies the requirement tensorflow (f

    这里写目录标题 报错内容 解决方法 其他方法 原因分析 报错内容 pip3 install tensorflow 输入上述命令安装tensorflow后出现下面的报错 ERROR Could not find a version that
  • chrome浏览器被hao123劫持如何解决?

    那天上班 打开电脑点开chrome浏览器 首页出现的是我熟悉的谷歌搜索页面 可是很快右边又打开了一个页面 123 hao234 com 这个流氓网站就这个这么不请自来了 而且之后我用尽了网上各种办法都弄不走 各种无效方法 1 绑定自己的主页
  • 背包九讲--混合背包、分组背包、资源分配背包、背包方案总数

    混合背包 混合背包 问题描述 一个旅行者有一个最多能用V公斤的背包 现在有n件物品 它们的重量分别是W1 W2 Wn 它们的价值分别为C1 C2 Cn 有的物品只可以取一次 01背包 有的物品可以取无限次 完全背包 有的物品可以取的次数有一
  • hive基础(二) hive操作大全

    目录 注 只是为了以后忘了 好翻 做个总结 一 hive 操作 1 hive e 2 hive f 3 查看在hive中输入的所有历史命令 4 hive运行日志修改 二 hive参数配置 三 hive数据类型 基本数据类型 集合数据类型 1
  • PHP与MySQL程序设计 学习笔记 第八章 错误和异常处理

    error reporting函数确定报告的敏感级别 共有16个不同级别 这些级别的任何组合都是有效的 error reporting函数使用 字符表示逻辑操作符NOT error reporting E ALL E STRICT 希望报告