php错误处理--php基础最详细教程

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 '参数问题';

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值