您的位置:首页 > 编程语言 > PHP开发

php的错误和异常处理

2015-10-22 17:40 691 查看
一,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的一部分。)

(2.4)语法错误,set_error_handler()错误控制案例,此处错误适应于E_WARNING,E_NOTICE,E_RECOVERABLE_ERROR,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();
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: