一.基础的错误处理
- 含义:一条消息会被发送到浏览器,这条消息带有文件名,行号以及一条描述错误的消息。
- 基本的错误处理:
if(!file_exists('welcome.txt')) { die('file not found'); } else { $file=fopen('welcome.txt', 'r'); }
如果没有上述的判断,会直接报错,产生warning.
二.创建自定义错误处理器
- 创建一个专用函数,可以在php中发生错误时调用该函数,该函数必须有能力处理至少两个参数(error level和error message),但是最多可以接受5个参数(可选:文件,行号,内容-一个数组,包含了当错误发生时在用的每个变量以及它们的值)
- set_error_handler('函数名'):遇到错误会触发,比如文件不存在,变量未定义等,以及自定义触发的错误(下面叙述)
function customError($error, $errstr) {
echo "<b>Error:</b>[$errno]$errstr";
}
set_error_handler('customError');
echo($test)
//上述代码会输出
Error:[8]Undefined variable:test
三.触发错误
- trigger_error(errormsg,errortype):函数创建用户级别的错误消息
参数:errormsg:规定错误消息
errortype:规定错误类型。E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE(默认
$test = 2;
if ($test>1) {
trigger_error('Value must be 1 or below');
}
//以上代码会输出
Notice:Value must be 1 or below in C:\webfolder\test.php on line 6
)
四.错误报告级别
常量 | 描述 |
E_WARNING | 非致命的run_time错误,不暂停脚本执行 |
E_NOTICE | run_time通知,脚本发现可能有错误发生,但也可能在脚本正常运行时发生 |
E_USER_ERROR | 致命的用户生成的错误,这类似于trigger_error()设置的E_ERROR |
E_USER_WARNING | 非致命的用户生成的警告,这类似于trigger_error()设置的E_WARNING |
E_USER_NOTICE | 用户生成的通知,这类似于trigger_error()设置的E_NOTICE |
E_RECOVERABLE_ERROR | 可捕获的致命错误,类似E_ERROR,但可被用户定义的处理程序捕获 |
E_ALL | 所有错误和警告,除级别E_STRICT以外 |
五.异常
- 含义:异常处理用于在指定的错误情况发生时改变脚本的正常流程,这种情况成为异常
- 异常触发时,会发生的情况:当前代码状态被保存。代码执行被切换到预定义的异常处理器函数。根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本。
- 处理方法:异常的基本使用。创建自定义的异常处理器。多个异常。重新抛出异常。设置顶层异常处理器。
六.异常的基本处理
function checkNum($number) {
if ($number>1) {
throw new Exception('Value must be 1 or below');
}
return true;
}
try {
checkNum(2);
}catch(Exception $e){
echo 'Message:'.$e->getMessage();
}
//上述代码会获得这样一个错误
Message:Value must be 1 or below;
七:创建一个自定义的Exception类
该类必须是exception类的一个扩展,该类继承了exception类的所有属性,您可向其添加自定义的函数
class customException extends Exception{
public function errorTwo() {
//定义错误处理
}
}
//继承了Exception的属性和方法
八:多个异常
try {
if($num>100) {
throw new Exception1($num);
}
if ($num==100) {
throw new Exception2($num);
}
}
catch(Exception1 $e) {
echo $e->getMessage();
}
catch(Exception2 $e) {
echo $e->getMessage();
}
九:重新抛出异常
如果在当前try中异常没有被捕获,则它将在更高层级上查找catch代码
try{
try{
if ($num == 100) {
throw new Exception($num);
}
}catch(Exception $e) {
throw new Exception1($num);
}
} catch(Exception1 $e) {
echo $e->errorMessage();
}
十:设置顶层异常处理器
set_exception_handler()函数可设置处理所有未捕获异常的用户定义函数
function myException($exception) {
echo "<b>Exception:</b>",$exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');