七、php 的错误和异常处理机制
7.1、错误处理
7.1.1、使用简单的die语句if(!flie_exists("luluyii.text")){
die("文件不存在');
}else{
//打开文件操作
}file_exists("luluyii.txt") or die("文件不存在");
7.1.2、PHP error_reporting()
错误控制函数功能详解
(1)定义和用法:error_reporting() 设置 PHP 的报错级别并返回当前级别。
(2)函数语法:error_reporting(report_level)
(3)如果参数 level 未指定,当前报错级别将被返回。下面几项是 level 可能的值:
(4)案例
任意数目的以上选项都可以用“或”来连接(用 OR 或 |),这样可以报告所有需要的各级别错误。
例如,下面的代码关闭了用户自定义的错误和警告,执行了某些操作,然后恢复到原始的报错级别://禁用错误报告
error_reporting(0);
//报告运行时错误
error_reporting(E_ERROR | E_WARNING | E_PARSE);
//报告所有错误
error_reporting(E_ALL);
php.ini 中关于错误级别的配置:error_reporting = E_ALL & ~E_NOTICE(一般都是这样配置)
7.1.3、设置调试PHP,debug php输出所有错误信息
①、任意环境下调试php,debug php
在不管php.ini配置的情况下开启php调试、php debug,在你需要调试的php文件首行中加入ini_set('display_errors',1); //错误信息
ini_set('display_startup_errors',1); //php启动错误信息
error_reporting(-1); //打印出所有的 错误信息
ini_set('error_log', dirname(__FILE__) . '/error_log.txt'); //将出错信息输出到一个文本文件
②、开发环境调试php,debug php php.ini 配置;显示错误信息
display_errors = On
;显示php开始错误信息
display_startup_errors = On
;日志记录错误信息
log_errors = On
7.1.4、用户自定义错误处理器
(一般用于处理语法错误)error_function (error_level,error_message,error_file,error_line,error_context)
其中 error_level 和 error_message 必须有
(1)案例入门function my_error($errno,$errmes){
echo "错误值=".$errno.",错误信息=".$errmes;
exit();
}//若出现 E_WARNING 这个级别的错误,则调用 my_error 函数
set_error_handle("my_error",E_WARNING);
$fp = fopen("luluyii.txt");
输出:错误值=2,错误信息= fopen() expects at least 2 paraments ,1 given
7.1.5、错误触发器 trigger_error
(一般用于处理逻辑错误)
(1)trigger_error() 用于触发一个用户级别的错误条件,如:E_USER_NOTICE/WARNING/ERROR,
它能结合内置的错误处理器所关联,或者可以使用用户自定义的函数作为新的错误处理程序。
(2)案例$age = 500;
if($age > 100){
trigger_error("输入年龄过大",E_USER_WARNING);
exit();
}
输出:Warning: 输入的年龄过大
7.1.6、php错误日记保存
(1)bool error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] )
把错误信息发送到 web 服务器的错误日志,或者到一个文件里。
常用的$message_type=3,此时message将会被发送到位置为destination的文件里,字符message不会默认被当做新的一份
(2)案例function my_error($errno,$errmes){
$err_info = "错误号是$errno -- $errmes";
echo $err_info;
// \r\n表示向文件输入一个回车换行
error_log($err_info."\r\n",3,"d:\myerr.txt");
}
7.2、异常处理
7.2.1、基本语法try {
//可能出现错误或是异常的代码
}catch (Exception $e){
//对异常处理:自己处理或者不处理将其抛出
}
7.2.2、案例try {
addUser("lulubin");
}catch (Exception $e){
echo "失败信息是:".$e->getMessage();
throw $e;
}
function addUser($username){
if($username == "luluyii"){
//添加成功,不输出
}else{
//添加失败并抛出异常
throw new Exception("添加失败");
}
}
输出:失败信息是:添加失败
7.2.3、细节讨论
(1)当捕获到一个异常代码后try{ }块里的后续代码不再执行
(2)如果有一个异常发生,但是没有catch,则提示 Uncated Exception
(3)当 catch 一个异常,你可以处理,也可以不处理,不处理就可以 throw new Exception("信息");//定义一个顶级异常处理器
function my_exception($e){
echo "我是顶级异常处理".$e->getMessage();
}
//修改默认的顶级异常处理器函数
set_exception_handler("my_exception");
function a($val){
if($val > 100){
throw new Exception("$val > 100");
}
}
try{
a("120");
}catch (Exception $e){
//可以 catch 代码中再次抛出异常
throw $e;
}
输出:我是顶级异常处理120 > 100
(4)可以自定义异常类class MyException extends Exception{ }
(5)使用多个 catch 块可以捕获不同种类的异常try{
//第一句话
//第二句话
}catch (Exception $e){
//处理/抛出
}catch (Exception $e){
//处理/抛出
}