PHP中的错误处理和异常处理机制分析
例:复制代码代码如下所示:
< PHP
美元= fopen(测试。txt,R');
在这里,而不是判断文件是否打开,如果文件不存在,将会出错。
>
所以正确的写作方法应该如下:
复制代码代码如下所示:
< PHP
如果(file_exists(测试.txt)){
$ F = fopen(测试。txt,R');
使用封闭后
Fclose($);
}
>
一个,三种PHP错误处理A,简单的模具()语句的方法;
它相当于出口();
例:
复制代码代码如下所示:
如果(!file_exists('AA .txt)){
模具(文件不存在);
{人}
操作
}
如果触发了上面的死{ /()),则不会执行该回声。
echo'ok;
简洁的写作:
复制代码代码如下所示:
file_exits('aaa .txt)或死亡(文件不存在);
echo'ok;
B,自定义错误和错误触发器
1。错误处理器(通常用于语法错误处理的自定义错误)
创建自定义的误差函数(处理器),函数必须有至少两个参数的能力(error_level和错误信息),但它最多可以接受五个参数(error_file,error_line,error_context)。
Grammar:
复制代码代码如下所示:
功能error_function(error_level美元,error_message美元,error_file美元美元美元,error_line,error_context)
/ /好的创造也需要重写set_error_handler()函数;
set_error_handler('error_function ',e_warning); / /这里error_function对应上述创建定制的处理器,用于自定义错误处理器错误使用水平二参数;
错误报告级别(理解)
这些错误报告级别是错误处理程序要处理的不同类型的错误:
价值
常数
描述
二
e_warning
非致命的运行时错误。脚本执行不挂起。
八
e_notice
运行时通知。
脚本发现可能有错误,但脚本正常运行时也可能发生错误。
二百五十六
e_user_error
一个致命的错误,由用户生成的。这类似于使用PHP函数trigger_error程序员e_error()。
五百一十二
e_user_warning
非致命性的用户生成的警告。这是类似于使用PHP函数trigger_error程序员e_warning()。
一千零二十四
e_user_notice
用户生成的通知。这是类似于使用PHP函数trigger_error程序员e_notice()。
四千零九十六
e_recoverable_error
一个致命的错误,可以捕捉的。e_error相似,但可以通过一个用户定义的处理程序捕获。(见set_error_handler())
八千一百九十一
e_all
所有的错误和警告,除了水平e_strict。
(在PHP 6中,e_strict部分e_all)
2。错误触发器(通常用于处理逻辑错误)
要求:例如,接受一个年龄,如果数字大于120,它被认为是一个错误。
传统的方法:
复制代码代码如下所示:
如果($ $ 120){
回声年龄错误;退出();
}
使用触发器:
复制代码代码如下所示:
如果($ $ 120){
/ / trigger_error(错误,错误级别});这个错误级别是可选的,是用来定义的误差水平
/ /自定义级别包含以下三种类型:e_user_warning,e_user_error,e_user_notice
trigger_error(时代错误); / /这是处理默认呼叫系统错误的方法,我们还可以使用自定义的处理器
}
自定义处理器,与上面相同
功能myerror(error_level美元,美元error_message){
echo'error文本;
}
同时需要更改默认的系统功能
set_error_handler('myerror ',e_user_warning); / /以上,第一个参数是自定义函数的名称,第二误差水平{这里的误差水平通常是以下三种类型:e_user_warning,e_user_error,e_user_notice }
现在/你可以使用trigger_error使用自定义错误处理程序。
练习题:
复制代码代码如下所示:
< PHP
date_default_timezone_set('prc);
功能myerror(error_level美元,美元error_message){
$信息=错误号:error_level美元;
元信息。= 的错误信息:error_message美元;
元信息。=发生的时间:'日期('y-m-d H:我:S);
为文件名= AA txt;
如果(!$ FP = fopen($文件名,'a')){
创建文件$文件名。失败;
}
如果(is_writeable($文件名)){
如果(!fwrite($ FP,$INFO)){
回声'写文件失败';
{人}
回声成功记录了错误信息;
}
Fclose($ FP);
{人}
文件,文件名不能写;
}
出口();
}
set_error_handler('myerror ',e_warning);
$ FP = fopen('aaa .txt,R');
>
c、错误日志
默认情况下,根据error_log php.ini的配置,PHP发送错误记录服务器的错误记录系统或文件。错误记录可以用error_log发送到文件或远程目的地()函数。
Grammar:
error_log(错误类型、目的地、头{,})
类型部分通常使用3,表示错误信息是在文件后面添加的,而不是原来的内容。
目标表示目的地、存储的文件或远程目的地。
如:error_log($ error_info
二,PHP异常处理{ }
1。基本语法
复制代码代码如下所示:
尝试{
可能的错误或异常代码
捕获捕获异常是PHP已经定义的一个定义的异常类。
} catch(异常E){
用于异常处理方法:
1,自我处理
2,不要处理它,把它再次抛出
}
2。处理过程应包括:
尝试——使用异常的函数应该在尝试代码块中。如果没有触发异常,代码将照常执行。但是如果触发异常,就会引发异常。
此处抛出指定如何触发异常。每个抛出必须对应至少一个catch
catch catch 代码块捕获异常并创建包含异常信息的对象。
让我们触发一个异常:
复制代码代码如下所示:
< PHP
创建异常函数
功能checknum(美元数){
如果($ > 1){
抛出新异常(值必须为1或以下);
}
返回true;
}
在尝试代码块中触发一个异常
尝试{
(2)checknum;
如果抛出异常,则将不输出以下行
echo'if看,数量为1或以下的;
} catch(异常E){
/异常
echo'message:' $ E -> GetMessage();
}
>
上面的代码也会有类似的错误:
消息:值必须在1或以下
示例说明:
上面的代码抛出一个异常并捕获它:
创建checknum()函数,检测数大于1。如果是这样的话,就会抛出一个异常。
checknum()的功能是在召试代码块。
在checknum例外()函数抛出
catch代码块接收异常并创建包含异常信息的对象($)。
通过调用GetMessage()$ E ->从异常对象,从异常输出错误信息
但是,为了遵循每个抛出必须与catch对应的原则,您可以在顶层设置一个异常处理器来处理遗漏的错误。
的set_exception_handler()函数可以设置一个自定义函数来处理所有未捕获的异常用户
复制代码代码如下所示:
顶级异常处理程序集
Function myexception ($e) {
echo'this最高的例外;
修改默认的异常处理程序
set_exception_handler(myexception );
尝试{
$ I = 5;
如果($ i 10){
抛出新异常($ i必须大于10);
}
} catch(异常E){
异常处理
回声(a -> GetMessage);
不处理异常,继续抛出
抛出异常('errorinfo '); / /可以把e保留原来的错误信息;
}
创建自定义异常类
复制代码代码如下所示:
类customexception延伸例外{
公共功能的错误信息(){
/ /错误信息errormsg美元=错误对线。美元-> getline()。在'。美元-> GetFile())。:。美元-> GetMessage()。
}
}
使用
尝试{
把新的customexception(错误信息);
} catch(customexception e){
echo $ E -> errormsg();
}
可以使用多个catch在不同情况下返回错误信息。
复制代码代码如下所示:
尝试{
$ I = 5;
如果($ i 0){
把新的customexception(错误信息'); / /使用自定义的异常处理
}如果($ i - 10){
抛出异常('error2 '); / /使用系统默认的异常处理
}
} catch(customexception e){
echo $ E -> GetMessage();
} catch(异常E1){
echo $ E1 -> GetMessage();
}
异常规则
需要做异常处理代码应该放在try代码块来捕捉潜在的例外。每个尝试或者把代码块必须有至少一个对应的catch代码块。多个catch代码块可以用来捕捉不同类型的例外。重新抛出的异常可以被再次在catch代码在try代码块。总之:如果抛出一个异常,它必须被捕获。