错误和异常是两个不同的概念
留待日后补充
1.错误
错误的分类:
- 语法错误
- 环境错误
- 逻辑错误
错误级别
常见的错误级别:
- Deprecated最低级别错误(脚本继续执行)
- Notice通知级别错误(脚本继续执行)
- Warning警告级别错误(脚本继续执行)
- FatalError致命级别错误(脚本终止执行)
- ParseError语法解析错误(脚本终止执行)
PHP配置文件中(php.ini)与错误有关的配置
配置选项 | 描述 |
---|---|
error_reporting | 设置错误报告的级别 |
display_errors | 是否显示错误 |
log_errors | 设置产生的错误信息是否记录到错误日志中,或者是error_log中 |
log_error_max_len | 设置log_errors最大字节数 |
ignore_repeated_errors | 是否忽略重复的错误信息 |
ignore_repeated_source | 是否忽略重复错误消息的来源 |
track_errors | 如果开启此选项,最后一个错误将永远保存在$php_errormsg中 |
设置错误级别
-
一、直接在
php.ini
文件中更改:error_reporting
的值; -
二、通过函数:
error_reporting()
进行设置 -
示例:
error_reporting(E_NOTICE);//仅显示notice级别的错误
error_reporting(E_ALL&~E_NOTICE);//除了notice级别的错误不可见,其他级别的错误都可见
error_reporting(0);//所有错误都不显示
echo $aa;
echo md4('asd');
- 三、也可以通过
ini_set()
函数进行设置- 第一个参数是设置的配置文件中配置选项的名称
- 第二个参数是配置的值
- 示例:
ini_set('error_reporting',-1);//显示所有错误
- 解析错误是否能显示,不能通过
error_reporting()
函数进行设置
手动触发错误
- 通过:
trigger_error()
函数,触发一个错误,类似try…catch…中的throw的功能- 第一个参数:字符串类型,错误信息
- 第二个参数:常量,错误级别
- 使用示例:
trigger_error("出错了",E_USER_NOTICE)
,触发一个notice级别的错误
将错误日志保存在指定文件中
- 一、直接修改php配置文件,修改
error_log
选项的值,路径设置为你想保存的路径 - 二、通过ini_set函数进行设置;
- 在PHP中,记录错误数据到指定文件中:
- 使用:
error_log('string')
函数,可以主动将错误保存到指定的错误日志文件中
- 使用:
自定义错误处理函数
- 使用:
set_error_handler()
函数可以自定义处理错误- 第一个参数:自定义处理函数名称
- 第二个参数:错误级别
- 这个函数只能捕获部分错误,例如fatalError级别的错误就无法捕获,
- 这个函数类似魔术方法,它就是把处理错误的方法,交给开发者自己去实现
- 如果不想自己处理,可以通过
restore_error_handler()
回收这个权限,该函数执行后,后续的错误将使用系统实现方式显示错误 - 示例:
function customError($errno,$errMsg,$filePath,$line){
echo "<b>错误</b>:{$errno}:{$errMsg},来自{$filePath}文件的第{$line}行";
}
set_error_handler('customError');
echo $a;
register_shutdown_function函数
- 作用是:在产生致命错误,导致脚本即将结束执行的时候,这个函数会被调用
- 参数1:回调函数的名称
- 参数2:可以通过传入额外的参数来将参数传给回调函数
- 这个函数是在内存中调用的,所以在函数中访问的路径必须是绝对路径
2.异常
- 异常需要主动抛出,否则,catch语句将永远不会执行
- throw语句之后的所有代码将不会执行
- 在一些特殊的类中是内置了throw的,例如PDO类中,不需要你手动的去抛出错误
错误和异常的区别
- 首先,当PHP脚本发生错误必须立即处理,而异常则不用马上处理
- 错误是不可预知的,而异常是可预知的,例如一段代码有可能会发生意外情况,这个是可预知的
- 而错误则可能因为你的语法错误、环境配置问题等各种问题,不可预知