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\r\n", FILE_APPEND);
  }
?>

Xdebug调试

# php.ini 中追加配置
[Xdebug]
zend_extension=D:\Program Files\xampp\php\ext\php_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');
	}
?>
posted @ 2020-11-14 19:42  wing1377  阅读(363)  评论(0编辑  收藏  举报