php错误报告及设置级别

在php.ini中设置

  • display_errors是否开启PHP输出错误报告的功能。值为:On(默认输出错误报告)、 Off(屏蔽所有错误信息)
  • ini_set() 动态设置php.ini配置文件.如:ini_set(“display_errors”,“On”); //显示所有错误信息
  • 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) 报告除用户导致的错误之外的所有错误。

如下所示:php.ini的设置

error_reporting = E_ALL //将向PHP发送每个错误
display_errors=Off     	//不显示错误报告
log_errors=On          	//决定日志语句记录的位置
log_errors_max_log=1024	// 每个日志项的最大长度
error_log=G:/myerror.log //指定错误写进的文件

在PHP脚本可以通过error_reporting( )函数动态设置错误报告级别。如:error_reporting(E_ALL);

<html>
    <head><title>测试错误报告</title></head>
    <body>
        <h2>测试错误报告</h2>
        <?php
            /*开启php.ini中的display_errors指令,只有该指令开启如果有错误报告才输出*/
            ini_set('display_errors', 1);
            /*通过error_reporting()函数设置在本脚本中,输出所有级别的错误报告*/
            error_reporting( E_ALL );
            
            /*“注意(notice)”的报告,不会阻止脚本的执行,并且可能不一定是一个问题 */
            getType( $var ); //调用函数时提供的参数变量没有在之前声明
            
            /*“警告(warning)”的报告,指示一个问题,但是不会阻止脚本的执行 */
            getType(); //调用函数时没有提供必要的参数
            
            /*“错误(error)”的报告,它会终止程序,脚本不会再向下执行 */
            get_Type(); //调用一个没有被定义的函数
        ?>
    </body>
</html>
    error_reporting(E_ALL & ~E_NOTICE);
    
    getType($a);
    echo "1111111111111111<br>";
    
    getType();
    echo "222222222222222222222<br>";
    
    getType3();
    echo "333333333333333333333<br>";

自定义PHP的错误报告处理方式

自定义错误报告的处理方式,可以完全绕过标准的PHP错误处理函数,这样就可以按自己定义的格式打印错误报告,或改变错误报告打印的位置,以下几种情况可以考虑自定义错误处理。

  • 可以记下错误的信息,及时发现一些生产环境出现的问题。
  • 可以屏蔽错误。
  • 可以控制错误的输出。
  • 可以作为调试工具。

使用set_error_handler()函数来设置用户自定义错误处理。

    /**
     * 定义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 ("<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>location="error.html" </script>';
        }
 	}
 	
 	//屏蔽程序中的错误
	error_reporting(0); 
	//把错误的处理交给error_handler()
    set_error_handler('error_handler');
    
    //使用末定义的变量要报 notice 的
    echo $novar;
    //除以0要报警告的
    echo 3/0;  
    //自定义一个错误
    trigger_error('Trigger a fatal error', E_USER_ERROR); 

注意E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING是不会被这个句柄处理的,也就是会用原始的方式显示,不过通常情况下不会发生。

header("Content-type:text/html;charset=utf8");

    //  error_reporting(E_ALL & ~E_NOTICE);
    //在php中注册一个函数, 来处理错误报告, 而不按原来的方式处理了
    set_error_handler("myerrorfun");

    $mess = "";
    //自己的错误报告处理函数
    function myerrorfun($error_type, $error_message, $error_file, $error_line) {
    
        global $mess;
        $mess.="发生错误级别为{$error_type}类型, 错误消息<b>{$error_message}</b>, 在文件<font color='red'>{$error_file}</font>中, 第{$error_line}行。<br>";
    }



    getType($a);

    echo "1111111111111111<br>";

    getType();

    echo "222222222222222222222<br>";

    echo "333333333333333333333<br>";
    
    echo "---------------------------------------------------------<br>";
    echo $mess;

设置错误日志

在php文件中使用error_log()来记录日志,就可以将信息写入到myerror.log文件中
如:error_log(“登录失败了!”);

windows系统日志查看
通过右击“我的电脑”-> 选择管理选项->在系统工具菜单中选择事件查看器->在应用程序选项中即可看到日志了。

Apache日志: 自定义日志文件

// 默认写到了Web服务器(apache)的错误日志中
 getType($a);
 echo "1111111111111111<br>";

 getType();
 echo "222222222222222222222<br>";

 error_log("数据库连接失败!");

 getType3();
 echo "333333333333333333333<br>";

自定义异常类

系统异常类

<?php
class Exception{
  	protected $message = 'Unknown exception';   // 异常信息
	protected $code = 0;                  // 用户自定义异常代码
	protected $file;                      // 发生异常的文件名
	protected $line;                      // 发生异常的代码行号
 	function __construct($message = null, $code = 0);
	final function getMessage();          // 返回异常信息
	final function getCode();             // 返回异常代码
	final function getFile();             // 返回发生异常的文件名
	final function getLine();             // 返回发生异常的代码行号
	final function getTrace();            // backtrace() 数组
	final function getTraceAsString();  // 已格成化成字符串的 getTrace() 信息
	 /* 可重载的方法 */
	function __toString();                // 可输出的字符串
}

自定义异常类必须继承自系统的异常类

<?php
    /* 自定义的一个异常处理类,但必须是扩展内异常处理类的子类 */
    class MyException extends Exception{
        //重定义构造器使第一个参数 message 变为必须被指定的属性
        public function __construct($message, $code=0){
            //可以在这里定义一些自己的代码
         //建议同时调用 parent::construct()来检查所有的变量是否已被赋值
            parent::__construct($message, $code);
        }   
        public function __toString() {        
          //重写父类方法,自定义字符串输出的样式
          return __CLASS__.":[".$this->code."]:".$this->message."<br>";
        }
        public function customFunction() {    
             //为这个异常自定义一个处理方法
             echo "按自定义的方法处理出现的这个类型的异常<br>";
        }
    }
?>

自定义异常

try { //使用自定义的异常类捕获一个异常,并处理异常
    $error = '允许抛出这个错误';       
    throw new MyException($error);    
        //创建一个自定义的异常类对象,通过throw语句抛出
    echo 'Never executed'; 
        //从这里开始,try代码块内的代码将不会再被执行
} catch (MyException $e) {        //捕获自定义的异常对象
    echo '捕获异常: '.$e;        //输出捕获的异常消息
    $e->customFunction();  //通过自定义的异常对象中的方法处理异常
}
echo '你好呀';              //程序没有崩溃继续向下执行

简单案例

<?php
/*
1. 自定义的异常类, 必须是系统类Exception的子类
2. 如果继承Exception类, 重写了构造方法,一定要调一下父类中被覆盖的方法
3. 在try代码之后,必须至少给出一个catch代码块,也可以将多个catch代码块与一个try代码块关联使用。
那么使用多个catch就可以捕获不同的类所产生的异常。注意顺序。
 */


//写出对应这个异常解决方法, 就是一下正常类的结构
class MyBtException extends Exception{
    function __construct($mess) {
        parent::__construct($mess);


    }

    function changBt() {
        echo "换上备胎!";
    }
}

class WcException extends Exception {
    function pro() {
        echo "去公厕<br>";
    }
}

class NoException extends Exception {
    function pro() {
        echo "买面色凑合一下!<br>";
    }
}

class FlException extends Exception {
    function pro() {
        echo "走小路!<br>";
    }
}

class  Dm  {
    function gowc($bj) {

        if(!$bj) {
            throw new  WcException("马桶不好用了"); 
        }
        
        echo "哈哈, 事儿办的很成功!<br>";
    }

    function eat($time) {
        if(!$time) {
            throw new NoException("起来晚了, 早餐没了!");
        }
        echo "吃的很好!<br>";
    }

    function dri($dz) {
        if(!$dz) {
            throw new MyBtException("爆胎了");
        }
        echo "车开的不错!<br>";
    }

    function run($yu) {
        if(!$yu) {
            throw new FlException("天下雪了, 高速封路了");
        }
        echo "高速很好走!<br>";
    }

}

echo "早上起床<br>";

try{
    $dm = new Dm();

    // 1. 上厕所  (马桶不好用了), 去公厕
    $dm -> gowc(true);

    // 2. 吃早餐 (没有早点), 买面包
    $dm -> eat(true);

    //3. 开车上班 (爆tai)    换下
    $dm ->dri(true);

    //4. 上高速  (下雪)  小路
    $dm->run(false);
} catch(MyBtException $e) {    //  Exception $e = new Exception('');
    echo $e->getMessage()."<br>";
    //自定义类中的解决方法调用, 解决了问题
    $e->changBt()."<br>";
    
    try {
    
    }catch(Exception $e) {
        
    }

} catch(NoException $e) {
    echo $e->getMessage()."<br>";
    $e->pro();
} catch(WcException $e) {
    echo $e->getMessage()."<br>";
    $e->pro();
} catch(Exception $e) {
    echo $e->getMessage()."<br>";
    //$e->pro();
}

echo "到公司开始工作<br>";
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值