php的错误和异常处理
2015-10-22 17:40
691 查看
一,php处理错误的三种方式:
1, 简单的die()语句;
2, 自定义错误和错误触发器;
3,错误日志;
1,简单的die()语句
上面的代码和下面的代码功能相同
2,自定义错误和错误触发器
php自带错误处理器,可以自己编写错误处理器。
(2.1)创建一个自定义的错误函数非常简单,我们可以创建一个专用函数,在PHP发生错误时候调用该函数。该函数必须有能力处理至少两个参数(error level 和error message),但是可以接受最多五个参数(可选的file,line-number以及error context):
(2.2)基本语法:error_function(error_level,error_message,error_file,error_line,error_context)
(a),编写错误函数。
(b),编写set_error_handler(),通知php系统,弃用默认错误处理器,使用自定义的错误函数。
(2.3)PHP中有不同的错误级别控制
(2.4)语法错误,set_error_handler()错误控制案例,此处错误适应于E_WARNING,E_NOTICE,E_RECOVERABLE_ERROR,E_ALL。
(2.5)逻辑错误,trigger_error()错误控制案例,这个可以在代码中编写程序,排除逻辑错误情况,没有必要使用trigger_error()。
自定义一个错误处理函数(和上类似),此处适用于E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE。
3,PHP错误日志
基本方法使用error_log(),使用方法如下,执行完如下代码,会在代码页所在的文件夹产生myerr.txt这个文件。
二,PHP异常处理机制
(1)需要进行异常处理的代码应该放入try代码块内,以便捕获潜在的异常。基本语法
(2) 当捕获到一个异常后,try{}块里的后续代码不继续执行。
(3) 如果有一个异常发生,但是你没有catch捕获,则系统捕获异常,并输出默认异常函数Uncatched Exception。
(4)当catch一个异常,你可以处理;可以不处理,将其抛出,系统捕获到这个异常,输出默认异常函数。
(5)系统捕获到这个异常,可以输出默认异常函数。也可以手动编写一个顶级异常处理函数,配置系统默认输出顶级异常处理函数,而不用系统默认函数。
(6)PHP的文件系统没有引入异常机制,所以PHP文件操作使用错误机制。比如下面的代码,代码不会抛出异常,只能系统默认抛出异常。
1, 简单的die()语句;
2, 自定义错误和错误触发器;
3,错误日志;
1,简单的die()语句
if(!file_exists("aaa.txt")){ die("文件不存在"); }else{ $fp = fopen("aaa.txt","r"); }
上面的代码和下面的代码功能相同
file_exists("aaa.txt") or die("文件不存在!"); $fp = fopen("aaa.txt","r");
2,自定义错误和错误触发器
php自带错误处理器,可以自己编写错误处理器。
(2.1)创建一个自定义的错误函数非常简单,我们可以创建一个专用函数,在PHP发生错误时候调用该函数。该函数必须有能力处理至少两个参数(error level 和error message),但是可以接受最多五个参数(可选的file,line-number以及error context):
(2.2)基本语法:error_function(error_level,error_message,error_file,error_line,error_context)
(a),编写错误函数。
(b),编写set_error_handler(),通知php系统,弃用默认错误处理器,使用自定义的错误函数。
(2.3)PHP中有不同的错误级别控制
值 | 常量 | 描述 |
2 | E_WARNING | 非致命的run-time错误,不暂停脚本运行。 |
8 | E_NOTICE | Run-time通知,脚本发现可能有错误发生,但也可能在脚本正常运行时发生。 |
256 | E_USER_ERROR | 致命的用户生成的错误,这类似于程序员使用PHP函数trigger_error()设置的E_ERROR。 |
512 | E_USER_WARNING | 非致命的用户生成的错误,这类似于程序员使用PHP函数trigger_error()设置的E_WARNING。 |
1024 | E_USER_NOTICE | 用户生成的通知,这类似于程序员使用PHP函数trigger_error()设置的E_NOTICE。 |
4096 | E_RECOVERABLE_ERROR | 可捕获的致命错误,类似E_ERROR,但可被用户定义的处理程序捕获。(参见set_error_handler()) |
8191 | E_ALL | 所有错误和警告,除级别E_STRICT以外。(在PHP6.0,E_STRRICT是E_ALL的一部分。) |
//定义了一个函数 function my_error($errno,$errmes){ echo "<font size='5' color='red'>$errno.$errmes</font>"; exit(); } //改写set_error_handler处理器 set_error_handler("my_error",E_WARNING); //定义了一个函数 function my_error1($errno,$errmes){ echo "<font size='5' color='red'>$errno.$errmes</font>"; exit(); } //改写set_error_handler处理器 set_error_handler("my_error1",E_NOTICE); $fp=fopen("aa.txt","r");
(2.5)逻辑错误,trigger_error()错误控制案例,这个可以在代码中编写程序,排除逻辑错误情况,没有必要使用trigger_error()。
$age = 700; if($age > 120){ //调用触发器 trigger_error("输入年龄过大"); exit(); }
自定义一个错误处理函数(和上类似),此处适用于E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE。
function my_error3($errno,$errmes){ echo "错误号是:".$errno; } set_error_handler("my_error3",E_USER_ERROR);//此处适用于E_user_ERROR,E_user_WARNING,E_user_NOTICE $age = 700; if($age > 120){ trigger_error("输入年龄过大",E_USER_ERROR); }
3,PHP错误日志
基本方法使用error_log(),使用方法如下,执行完如下代码,会在代码页所在的文件夹产生myerr.txt这个文件。
function my_error3($errno,$errmes){ $err_info = "错误号是:".$errno; echo $err_info; date_default_timezone_set("Asia/Chongqing"); error_log("时间是".date("Y-m-d G-i-s")."--".$err_info."\r\n",3,"myerr.txt"); } set_error_handler("my_error3",E_USER_ERROR);//此处适用于E_user_ERROR,E_user_WARNING,E_user_NOTICE $age = 700; if($age > 120){ trigger_error("输入年龄过大",E_USER_ERROR); }
二,PHP异常处理机制
(1)需要进行异常处理的代码应该放入try代码块内,以便捕获潜在的异常。基本语法
try{ //可能出现错误或异常的代码 }catch(Exception e){ //对异常处理,(1)自己处理(2)自己不处理,将其抛出 }
(2) 当捕获到一个异常后,try{}块里的后续代码不继续执行。
(3) 如果有一个异常发生,但是你没有catch捕获,则系统捕获异常,并输出默认异常函数Uncatched Exception。
function a1($val){ if($val > 100){ throw new Exception("val>100"); } } function a2($val){ if($val == "hello"){ throw new Exception("不要输入hello"); } } a2("hello");
(4)当catch一个异常,你可以处理;可以不处理,将其抛出,系统捕获到这个异常,输出默认异常函数。
function a1($val){ if($val > 100){ throw new Exception("val>100"); } } function a2($val){ if($val == "hello"){ throw new Exception("不要输入hello"); } } try{ a2("hello"); }catch(Exception $ex){ //可以处理 // echo $ex->getMesage(); //可以不处理,抛出 throw $ex; }
(5)系统捕获到这个异常,可以输出默认异常函数。也可以手动编写一个顶级异常处理函数,配置系统默认输出顶级异常处理函数,而不用系统默认函数。
//定义一个顶级异常处理器 function my_exception($ex){ echo "我是顶级异常处理:".$ex->getMessage(); } //修改默认的顶级异常处理函数,默认异常处理函数是系统函数 set_exception_handler("my_exception"); function a1($val){ if($val > 100){ throw new Exception("val>100"); } } function a2($val){ if($val == "hello"){ throw new Exception("不要输入hello"); } } try{ a2("hello"); }catch(Exception $ex){ //可以处理 // echo $ex->getMesage(); //可以不处理,抛出 throw $ex; //可以自己定义一个顶级异常处理器 }
(6)PHP的文件系统没有引入异常机制,所以PHP文件操作使用错误机制。比如下面的代码,代码不会抛出异常,只能系统默认抛出异常。
try{ $fp = fopen("aaa.txt","r"); }catch(Exception $ex){ echo "ok.txt"; echo $ex->getMessage(); }
相关文章推荐
- PHP获取下个月的1月1日,唯一要解决的其实就是跨年的问题
- php.ini文件中关于cookie和session的设置
- php 使用session保存页面登录信息
- PHP Session 登陆 验证
- Zend不支持php5.3、不支持Windows下非线程安全PHPFastCGI
- PHP设计模式一:工厂方法设计模式
- PHP中each与数组变量分离的那些事情
- php 常用函数
- 国内常用NTP服务器地址及IP
- php 框架
- 算法杂项
- php数字每三位加逗号的功能函数
- php之文件上传
- Yii2分页
- [php] thinkphp实现 163 qq 邮箱收发邮件(切实可用)
- 通过smtp协议简单实现邮件发送
- Thinlphp 模版 foreach 嵌套在 另一个循环出现不能在次循环问题。
- php安装
- HDOJ 1096 A+B for Input-Output Practice (VIII)
- HDOJ 1095 A+B for Input-Output Practice (VII)