在 PHP 中,默认的错误处理很简单。一条消息会被发送到浏览器,这条消息带有文件名、行号以及一条描述错误的消息。
不同的错误处理方法:
l 简单的 "die()" 语句
l 自定义错误和错误触发器
l 错误报告
Ø die() 语句(与exit()相同)
<?php
if(!file_exists("welcome.txt")){
die("File not found");
} else {
$file=fopen("welcome.txt","r");
}
?>
现在,假如文件不存在,您会得到类似这样的错误消息:
File not found
Ø PHP的错误报告级别
级别常量 | 错误报告描述 |
E_ERROR | 致命的运行时错误,它会组织脚本的执行 |
E_WARNING | 运行时警告(非致命的错误) |
E_PARSE | 从语法中解析错误 |
E_NOTICE | 运行时注意消息(可能是或可能不是一个问题) |
E_CORE_ERROR | 类似E_ERROR,但不包括PHP核心造成的错误 |
E_CORE_WARNING | 类似E_WARNING,但不包括PHP核心错误报告 |
E_COMPILE_ERROR | 致命的编译时错误 |
E_COMPILE_WARNING | 致命的编译时警告 |
E_USER_ERROR | 用户导致的错误信息 |
E_USER_WARNING | 用户导致的警告 |
E_USER_NOTICE | 用户导致的注意消息 |
E_ALL | 所有的错误、警告和注意 |
E_STRICT | 关于PHP版本移植的兼容性和互操作性建议 |
Ø 可以通过在php.ini配置文件中将display_errors指令的值设置为On,开启PHP输出错误报告的功能。可以调用函数ini_set()函数,动态设置配置文件的某个指令。(如ini_set(“display_errors”,1));
Ø 在网站投入使用时应该禁用错误报告的输出,即设置display_errors为Off;
Ø 可以在php.ini中通过设置error_reporting的值调整错误报告的级别,可以把位运算符&(与)、|(或)、~(非)和错误级别常量一起使用:
error_reporting=E_ALL&~E_NOTICE //抛出任何非注意的错误,默认值
error_reporting=E_ERROR|E_PARSE|E_CORE_ERROR //只考虑致命的运行时错误,解析错误和核心错误
error_reporting=E_ALL&~(E_USER_ERROR| E_USER_WARNING|E_USER_NOTICE) //报告除用户错误之外的所有错误
使用函数error_reporting(0)(关闭错误输出)、error_reporting(E_ALL)(抛出所有错误)、error_reporting(E_ALL&~(E_WARNING|E_NOTICE))。
Ø 确定PHP错误报告行为的配置指令
配置指令 | 描述 | 默认值 |
display_startup_errors | 是否显示PHP引擎在初始化时遇到的所有错误 | Off |
log_errors | 确定日志语句记录的位置 | Off |
error_log | 设置错误可以发送到syslog,可设置为日志文件所在的路径 | Null |
log_errors_max_len | 每个日志项的最大长度,以字节为单位,设置0表示指定最大长度 | 1024 |
ignore_repeated_errors | 是否忽略同一文件同一行发生的重复的错误消息 | Off |
ignore_repeated_source | 忽略不同文件中或同一文件不同行上发生的重复错误 | Off |
track_errors | 启动该指令会使PHP在$php_errormsg中存储最近发生的错误信息 | Off |
Ø 使用trigger_error()可以生成一个用户警告,如trigger_error(“errormessage~”, E_USER_ERROR),通过添加的第二个参数,规定所触发的错误级别
可能的错误类型:
E_USER_ERROR - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断。
E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断。
E_USER_NOTICE - 默认。用户生成的 run-time 通知。脚本发现了可能的错误,也有可能在脚本运行正常时发生。
示例:
在本例中,如果"test" 变量大于 "1",则发生 E_USER_WARNING 错误。如果发生了 E_USER_WARNING,我们将使用我们的自定义错误处理程序并结束脚本:
<?php
//error handler function
function customError($errno, $errstr)
{
echo"<b>Error:</b> [$errno] $errstr<br />";
echo "EndingScript";
die();
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
{
trigger_error("Valuemust be 1 or below",E_USER_WARNING);
}
?>
以上代码的输出应该类似这样:
Error: [512] Value must be 1 or below
Ending Script。
Ø 自定义错误处理:
function error_handler($error_level, $error_message, $file, $line){ 方法体 }
set_error_handler(“error_handler”);
echo $novar; //会根据函数输出错误信息
E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING不会被set_error_handler()这个句柄处理,会以最原始的方式显示出来,不过出现这些都是编译或PHP内核出错,通常不会发生。
使用set_error_handler()后,error_reporting()将会失效,即所有错误(除上述错误)都会交给自定义的函数处理。
Ø PHP中写错误日志
使用指定的文件记录错误的报告日志,一定要确保这个文件存放在文档根目录之外,以减少遭到攻击的可能性,并且PHP脚本的执行用户(web服务器的进程所有者)具有写权限。需要对php.ini更改如下:
error_reporting = E_ALL
display_errors = Off
log_errors = On
log_errors_max_len = 1024
error_log = /usr/local/error.log ;指定产生的错误报告写入的日志文件位置
可以使用error_log()函数送出一个用户自定义的错误信息
bool error_log(string message [, int message_type [, stringdestination [, string extra_headers]]]) 此函数会送出错误信息到Web服务器的错误日志文件、某个TCP服务器或到指定文件中。
message为要送出的错误信息,message_type为0表示送到操作系统的日志;1表示使用PHP的Mail()函数,发送信息到E-mail处,extra_headers也会用到;2则将错误信息送到TCP服务器中,此时destination表示目的地IP及Port;3则将信息存到文件destination中。
a. error_log(“...”, 0);
b. error_log(“...”, 1, “webmaster@domain.com”);
c. error_log(“...”, 2, “localhost”);
d. error_log(“...”, 3, “/usr/local/errors.log”)
将日志记录到操作系统日志中,设置error_log=syslog
PHP提供实现写消息到操作系统日志的需要一起使用的4个专用函数define_syslog_variables()、openlog()、syslog()和closelog()。
示例:
<?php
define_syslog_variables();
openlog(“php5”,LOG_PID, LOG_USER);
syslog(LOG_WARNING, “警告时间:”.date(“Y/m/dH:i:s”));
closelog();
Ø PHP中的异常处理
处理异常需要的PHP脚本示例
try{
$error = ‘Always throw this error!’;
throw new Exception($error);
echo ‘Never executed’;
} catch (Exception $e) {
echo ‘Caught exception:’.$e->getMessage().’\n’;
} finally{
# … code
}
如果使用自定义的类作为异常处理类,则必须是扩展内置异常类Exception的子类,非Exception类的子类是不能作为异常处理类使用。
PHP中可以捕获多个异常