• PHP基础之错误处理及调试


    PHP错误处理及调试

    • 常见错误类型

      • 语法错误
      • 运行错误
      • 逻辑错误
      • 环境错误
    • 错误级别

      • notice 提示,报错后继续执行
      • warning 警告,报错后继续执行
      • error 致命错误,报错后停止执行

    如何处理错误

    显示错误报告

    • 显示错误报告
      • 修改配置文件(php.ini),实现显示错误报告
        • error_reporting = E_ALL 报告所有的错误
        • display_errors = On 将错误显示在浏览器上
      • error_reporting()ini_set(),ini配置仅脚本中生效
      • die() 函数,自定义输出错误信息,常用于业务逻辑错误提示
    # error_reporting()函数 和 ini_set()函数
    <?php
        ini_set('display_errors', 1);
        $rand_num= rand(0, 1);
        echo $rand_num;
        if($rand_num==0){
            # 报告所有错误
            error_reporting(E_ALL);
        }else{
            # 报告除了Notice之外的所有错误
            error_reporting(E_ALL & ~E_NOTICE);
        }
        echo $info;
    ?>
    
    # die()函数,自定义输出错误信息
    <?php
        header('Content-Type: text/html;charset=utf-8');
        $result= defined('PAI');
        if(!$result){
            die("PAI常量不存在!");
        }
    ?>
    
    # 通过逻辑运算符的短路特性,die()与or配合使用
    <?php
        $result= defined('PAI') or die("PAI常量不存在!");
    ?>
    

    记录错误日志

    • 记录错误日志
      • 修改配置文件(php.ini),实现显示错误报告
        • error_reporting = E_ALL 报告所有的错误
        • log_error=On; 将错误记录在日志中
        • error_log=/tmp/php_errors.log 错误日志保存的地址
      • error_log() 函数,将错误记录到指定的日志文件中或发送电子邮件到指定地址
        • 0 默认。根据在 php.ini 文件中的 error_log 配置,错误被发送到服务器日志系统或文件。
        • 1 错误被发送到 destination 参数中的地址。只有该类型使用 headers 参数。
        • 3 错误发送到文件目标字符串。
    <?php
        $a= 12;
        if($a<10){
            error_log("$a小于10", 0);
            echo "here";
        }elseif($a==10){
            error_log("$a等于10", 1, "1509061327@qq.com");
        }elseif($a>10){
            error_log("$a大于10", 3, "G:/error.log");
        }
    ?>
    

    开发过程中的模式

    • 开发过程中的模式
      • 开发模式:错误显示在浏览器上,不要记录在日志中
      • 运行模式:错误不显示在浏览器上,记录是日志中
    <?php
      $debug=false;		//true:开发模式  false:运行模式
      ini_set('error_reporting',E_ALL);	//所有的错误有报告
      if($debug){
        ini_set('display_errors','on');	//错误显示是浏览器上
        ini_set('log_errors','off');	//错误不显示在日志中
      }else{
        ini_set('display_errors','off');
        ini_set('log_errors','on');
        ini_set('error_log','./err.log');	//错误日志保存的地址
      }
      echo $num;    //测试
    ?>
    

    自定义错误处理

    • trigger_error 函数
      • 产生一个用户级别的error/warning/notice信息
      • 用户级别的错误的常量名中一定要带有USER
    <?php
      $age=100;
      if($age>80){
        # 默认触发了notice级别的错误
        trigger_error('年龄不能超过80岁');  
        # 触发notice级别的错误
        trigger_error('年龄不能超过80岁',E_USER_NOTICE);	
        # 触发warning级别的错误
        trigger_error('年龄不能超过80岁',E_USER_WARNING);
        # 触发error级别的错误
        trigger_error('年龄不能超过80岁', E_USER_ERROR);   
      }
    ?>
    
    • set_error_handler() 函数
      • 自定义错误处理器
    <?php
        function error() {
            echo '这是自定义错误处理';
        }
        # 注册错误处理函数,只要有错误就会自动的调用错误处理函数
        set_error_handler('error');	
        echo $num;
    ?>
    
    # 带参数
    <?php
      /**
        * 自定义错误处理函数
        * @param $errno int 错误类别
        * @param $errstr string 错误信息
        * @param $errfile string 文件地址
        * @param $errline int 错误行号
      **/
      function error($errno,$errstr,$errfile,$errline) {
        switch($errno){
          case E_NOTICE:
          case E_USER_NOTICE:
            echo '记录在日志中,上班后在处理<br>';
            break;
          case E_WARNING:
          case E_USER_WARNING:	
            echo '给管理员发邮件<br>';
            break;
          case E_ERROR:
          case E_USER_ERROR:
            echo '给管理员打电话<br>';
            break;
          }
          echo "错误信息:{$errstr}<br>";
          echo "错误文件:{$errfile}<br>";
          echo "错误行号:{$errline}<br>";
      }
      set_error_handler('error');
      echo $num;
    ?>
    

    异常处理

    try catch

    • 异常的处理
      • throw 关键字抛出异常
      • try{} catch(){} 捕获异常
    <?php
        function checkNum($num){
            if($num > 1){
                # 抛出自定义异常
                throw new Exception("Value must be 1 or below");
            }
            return true;
        }
        # 可能触发异常的代码
        try{
            checkNum(2);
        }
        # 捕获异常
        catch(Exception $e){
            echo 'message:'.$e-> getMessage();
        }
    ?>
    

    顶层异常处理器

    • 顶层异常处理器
      • 用于没有用try/catch块来捕获的异常
    <?php
        function ExceptionHandle($exception){
            echo "<b>异常信息:</b>".$exception-> getMessage();
        }
        set_exception_handler("ExceptionHandle");
        throw new Exception("你没有捕获的异常来了");
    ?>
    

    PHP调试技术

    使用输出函数进行调试

    • 使用输出函数进行调试
      • print() 用于输出字符串
      • echo() 用于输出一个或多个字符串
      • print_r() 用于打印一个变量易于理解的信息,如数组
      • var_dump() 用于打印变量的相关信息,如布尔值

    使用文件记录进行调试

    • 使用文件记录进行调试
      • file_put_contents() 可以将程序的相关信息记录到某个文件中
    <?php
      date_default_timezone_set("Asia/Shanghai");
      $path= $_SERVER['DOCUMENT_ROOT']."/error_log.txt";
      $data= 10;
      if($data> 5){
        # 将调试信息追加记录到文件error_log.txt中
        file_put_contents($path, date("Y-m-d H:i:s", time())."数据大于5
    ", FILE_APPEND);
      }
    ?>
    

    Xdebug调试

    # php.ini 中追加配置
    [Xdebug]
    zend_extension=D:Program Filesxamppphpextphp_xdebug.dll
    xdebug.profiler_enable=on
    xdebug.remote_enable=on
    xdebug.remote_handler=dbgp
    xdebug.remote_host=localhost
    xdebug.remote_port=9000
    xdebug.idekey=Visual Studio Code
    xdebug.trace_output_dir="../Projects/xdebug"
    xdebug.profiler_output_dir="../Projects/xdebug"
    
    # 测试程序
    <?php
    	textXdebug();
    	function textXdebug(){
    		requireFile();
    	}
    	function requireFile(){
    		require_once('abc.php');
    	}
    ?>
    
  • 相关阅读:
    Mina入门demo
    MySQL数据库插入中文时出现Incorrect string value: 'xE6x97xB7xE5x85xA8' for column 'sz_name' at row 1
    synchronized和volatile
    springboot+Zookeeper+Dubbo入门
    zookeeper的安装
    windows下dubbo-admin的安装
    Java 枚举类
    Mysql 解压版 安装时候的注意事项
    Java——JDBC鶸笔记
    《初识Java微信公众号开发》 学习中遇到的困难
  • 原文地址:https://www.cnblogs.com/SharkJiao/p/13974440.html
Copyright © 2020-2023  润新知