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.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
"
; getType(); echo "222222222222222222222
"
; getType3(); echo "333333333333333333333
"
;

自定义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 ("%s: %s in %s on line %d
\n"
, $error_type, $error_message, $file, $line); //若出现错误则跳转到友好错误提示页面 if(TRUE === $EXIT) { echo ''; } } //屏蔽程序中的错误 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}类型, 错误消息{$error_message}, 在文件{$error_file}中, 第{$error_line}行。
"
; } getType($a); echo "1111111111111111
"
; getType(); echo "222222222222222222222
"
; echo "333333333333333333333
"
; echo "---------------------------------------------------------
"
; echo $mess;

设置错误日志

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

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

Apache日志: 自定义日志文件

// 默认写到了Web服务器(apache)的错误日志中
 getType($a);
 echo "1111111111111111
"
; getType(); echo "222222222222222222222
"
; error_log("数据库连接失败!"); getType3(); echo "333333333333333333333
"
;

自定义异常类

系统异常类


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();                // 可输出的字符串
}

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


    /* 自定义的一个异常处理类,但必须是扩展内异常处理类的子类 */
    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."
"
; } public function customFunction() { //为这个异常自定义一个处理方法 echo "按自定义的方法处理出现的这个类型的异常
"
; } } ?>

自定义异常

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

简单案例


/*
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 "去公厕
"
; } } class NoException extends Exception { function pro() { echo "买面色凑合一下!
"
; } } class FlException extends Exception { function pro() { echo "走小路!
"
; } } class Dm { function gowc($bj) { if(!$bj) { throw new WcException("马桶不好用了"); } echo "哈哈, 事儿办的很成功!
"
; } function eat($time) { if(!$time) { throw new NoException("起来晚了, 早餐没了!"); } echo "吃的很好!
"
; } function dri($dz) { if(!$dz) { throw new MyBtException("爆胎了"); } echo "车开的不错!
"
; } function run($yu) { if(!$yu) { throw new FlException("天下雪了, 高速封路了"); } echo "高速很好走!
"
; } } echo "早上起床
"
; 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()."
"
; //自定义类中的解决方法调用, 解决了问题 $e->changBt()."
"
; try { }catch(Exception $e) { } } catch(NoException $e) { echo $e->getMessage()."
"
; $e->pro(); } catch(WcException $e) { echo $e->getMessage()."
"
; $e->pro(); } catch(Exception $e) { echo $e->getMessage()."
"
; //$e->pro(); } echo "到公司开始工作
"
;

你可能感兴趣的:(【PHP基础】,错误报告,错误级别,错误报告设置,php,异常处理)