PHP的错误和异常处理 原创
PHP的错误处理方式
错误处理
PHP程序的错误发生一般归属于下列三个领域:
语法错误: 如 声明变量未加 $ 功能执行语句未加 ; 等
语法错误最常见,并且也容易修复。如:代码中遗漏一个分号。这类错误会阻止脚本的执行。
运行时错误:
这种错误一般不会阻止PHP脚本的执行,但会阻止当前要做的事情。输出一条错误,但php脚本继续执行
逻辑错误: 如if($i = 9) if($i == 9)
这种错误最麻烦,既不阻止脚本执行,也不输出错误消息。
错误报告级别
常用错误报告:1 最高 8 最小
错误:E_ERROR 1 此错误会终止所以程序运行
警告:E_WARNING 2 发出警告的行 将无法正常运行,程序继续向下执行
注意:E_NOTICE 8 不影响程序运行,只是会显示注意信息,如变量未声明就使用
调整错误报告级别
(显示的错误信息级别)
错报报告建议:
在开发程序时,输出所有错误报告有利于程序调试,包括开启注意信息。
在程序上线运行阶段,不要输出到网页内任何一种错误报告(不专业,危险)可以输出到指定的文件。
错报报告调整方式
说明:调整方式有两种,建议使用第二种,移植性好。不用考虑其他服务器消息设置的方式;
第一种:更改php.ini的配置文件,长久有效。
打开php.ini 查找到 error_reporting 位置;
error_reporting = E_ALL 开启所有错误报告
error_reporting = E_ALL & ~E_NOTICE 开启所有错误日志,除了注意消息
error_reporting = E_ALL & ~E_NOTICE | E_STRICT 开启所有错误日志,除了注意消息和标准化警告。
第二种:使用相关函数在页面中设置,加载的页面生效。不加载不生效。
1. error_reporting(E_ALL & ~E_NOTICE); (函数设置第一种)
error_reporting(1); (开启所有错误信息)
error_reporting(0); (关闭所有错误信息)
2.ini_set('error_reporting','E_ALL'); 设置配置的参数 (使用此方式)
ini_get('upload_max_filesize'); 获得配置文件的设置参数。
使用trigger_error()函数代替die()
说明:
首先函数die()等同于exit(),两者如果执行都会中止PHP程序,而且可以在退出程序之前输出一些错误报告。
trigger_error()则可以生成一个用户警告来代替,使用程序更具有灵活性。例如,trigger_error("没有找到文件",
E_USER_ERROR)。使用trigger_error()函数来替代die(),你的代码在处理错误上会更具优势,对于客户程序员来
说更易于处理错误。
自定义处理方式
<?php
/**
*不需要掌握
* 定义Error_Handler函数,
* 作为set_error_handler()的第一个参数"回调"
* @param int $error_level 错误级别
* @param string $error_message 错误信息
* @param string $file 错误所在文件
* @param int $lin 错误所在行数
*/
function error_handler($error_level,$error_message, $file, $line)
{
$EXIT = FALSE;
switch( $error_level ) {
//提醒级别
case E_NOTICE:
case E_USER_NOTICE :
$error_type = 'Notice'; break;
//警告级别
case E_WARNING:
case E_USER_WARNING:
$error_type = 'Warning'; break;
//错误级别
case E_ERROR:
case E_USER_ERROR:
$error_type = 'Fatal Error';
$EXIT = TRUE; break;
//其他末知错误
default:
$error_type = 'Unknown';
$EXIT = TRUE; break;
}
//直接打印错误信息,也可以写文件或数据库
//printf($format,$a,$b,$c)
printf ("<font color='#FF0000'><b>%s</b></font>: %s in <b>%s</b> on line <b>%d</b><br>\n", $error_type, $error_message, $file, $line);
//若出现错误则跳转到友好错误提示页面
if(TRUE === $EXIT) {
echo '<script type="text/javascript">window.location="er.html" </script>';
}
}
error_reporting(0); //屏蔽程序中的错误
set_error_handler('error_handler'); //这个才是关键点,把错误的处理交给error_handler()
echo $novar; //使用末定义的变量要报 notice 的
// echo 3/0; //除以0要报警告的
// trigger_error('Trigger a fatal error', E_USER_ERROR); //自定义一个错误
写到错误日志
说明:为了安全,和网页可读性更好。应该立即将display_errors 选项关闭 ,来把信息输出到指定文件或者是操作系统日志中。
第一种情况:默认会写入到web服务器系统日志中
(不需要特别设置)
修改php.ini文件:
error_reporting = E_ALL //将向PHP发送每个错误
display_errors=Off //不显示错误报告
log_errors=On //决定日志语句记录的位置
log_errors_max_len=1024// 每个日志项的最大长度
使用函数设置:
ini_set('error_reporting','E_ALL');
ini_set('display_errors','Off'); // On或Off 1或0
ini_set('log_errors','On');
ini_set('log_errors_max_len','1024');
第二种情况:写入到指定的文件中
修改php.ini文件:
error_reporting = E_ALL //将向PHP发送每个错误
display_errors=Off //不显示错误报告
log_errors=On //决定日志语句记录的位置
log_errors_max_len=1024// 每个日志项的最大长度
error_log=D:/myerror.log//指定错误写进的文件
使用函数设置:
ini_set('error_reporting','E_ALL');
ini_set('display_errors','Off');
ini_set('log_errors','On');
ini_set('log_errors_max_len','1024');
ini_set('error_log','d:/myerror.log');
第三种情况:写入到操作系统的日志中
修改php.ini文件:
error_reporting = E_ALL //将向PHP发送每个错误
display_errors=Off //不显示错误报告
log_errors=On //决定日志语句记录的位置
log_errors_max_len=1024// 每个日志项的最大长度
error_log= syslog//指定错误写进的文件
使用函数设置:
ini_set('error_reporting','E_ALL');
ini_set('display_errors','Off');
ini_set('log_errors','On');
ini_set('log_errors_max_len','1024');
ini_set('error_log','syslog');
使用函数设置:
// define_syslog_variables(); 5.3.0以后此句省略
ini_set('display_errors','Off'); //关闭屏幕输出
openlog('Mylog',LOG_PID,LOG_USER);
syslog(LOG_WARNING,iconv('utf-8','gbk','test'));
closelog();
说明:
1.致命错误E_ERROR不会写入到指定的文件和操作系统日志里。
2.手写一条信息到错误日志: error_log("这是85期测试错误信息文件:".__FILE__.'所在行数:'.__LINE__);
3.默认情况下,在设置了display_errors=Off 或 ini_set('display_errors','Off');后系统的致命信息还是会输出到页面内,
屏蔽方法为,添加一条语句 error_reporting(0); ?> 并闭合PHP标签
程序员自己处理错误信息
//程序员自己处理错误
//set_error_handler
set_error_handler('myerror');
function myerror($level,$message,$file,$line){
$str = date('Y-m-d H:i:s')."\n";
$str .= '错误级别:'.$level."\n";
$str .= '错误信息:'.$message."\n";
$str .= '错误文件'.$file."\n";
$str .= '错误行号'.$line."\n";
//error_log($str,3,'d:/log.txt');
echo $str;
}
in_array();
var_dump();
屏幕显示,并写入文件
注意:
set_error_handler 函数用法
error_log 函数用法
PHP的异常处理
<?php
class DBException extends Exception{
public function __toString(){
return $this->message;
}
}
class HTMLException extends Exception{
public function __toString(){
return $this->message;
}
}
try{
throw new HTMLException('页面不存在');
}catch(DBException $db){
echo '数据链接失败';
}catch(HTMLException $html){
echo '页面不存在l';
}catch(Exception $ex){
echo '参数问题';
}