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

本文主要是介绍PHP与MySQL程序设计 学习笔记 第八章 错误和异常处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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的。

这篇关于PHP与MySQL程序设计 学习笔记 第八章 错误和异常处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/940688

相关文章

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

MySQL 迁移至 Doris 最佳实践方案(最新整理)

《MySQL迁移至Doris最佳实践方案(最新整理)》本文将深入剖析三种经过实践验证的MySQL迁移至Doris的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于CDC(ChangeData... 目录一、China编程JDBC Catalog 联邦查询方案(适合跨库实时查询)1. 方案概述2. 环境要求3.

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串