• PHP基础(四)错误处理


    错误处理

    错误处理:指的是系统(或者用户)在对某些代码进行执行的时候,发现有错误,就会通过错误处理的形式告知程序员。

    错误分类

    1)语法错误:用户书写的代码不符合PHP语法规范,语法错误会导致代码在编译过程中不通过,所以代码不会执行(parse error)

    2)运行时错误:代码编译通过,但是代码在执行过程中会出现一些条件不满足导致的错误(runtime error)

    3)逻辑错误:程序员在写代码的时候不够规范,出现了一些逻辑性的错误,导致代码正常执行,但是得不带想要的结果

    错误代号

    所有看到的错误代号在PHP中都被定义成立系统常量(可以直接使用)

    1)系统错误:

    E_PARSE:编译错误,代码不会执行

    E_ERROR:fatal error,致命错误,会导致代码不能正确继续执行(出错的位置断掉)

    E_WARNING:warning,警告错误,不会影响代码执行,但是可能得到意想不到的结果。

    E_NOTICE:notice,通知错误,不会影响代码执行

    2)用户错误:E_USER_ERROR、E_USER_ WARNING、E_USER_ NOTICE

    用户在使用自定义错误触发的时候,会使用到的错误代号(系统不会用到)

    3)其他:E_ALL,代表着所有的错误,(通常在进行错误控制的时候使用比较多),建议在开发过程中(开发环境)使用

    所有以E开头的错误常量(代号)其实都是由一个字节存储,然后每一种错误占据一个对应的位,如果想进行一些错误的控制,可以使用位运算进行操作。

    如:

    排除通知级别notice:E_ALL & ~E_NOTICE

    只要警告和通知:E_WARNING | E_NOTICE

     

    错误触发

    程序运行时触发:系统自动根据错误发生后,对比对应的错误信息,输出给用户,主要针对代码的语法错误和运行时错误。

    人为触发:知道某些逻辑可能会出错,从而使用对应的判断代码来触发响应的错误提示。

    trigger_error(‘提示信息’[,错误级别]),可以通过第二个参数进行严格性控制。

    错误显示设置

    错误显示设置:哪些错误该显示,以及该如何显示

    在PHP中,其实有两种方式来设置当前脚本的错误处理。

    1、PHP的配置文件:全局配置,php.ini文件

    display_errors:是否显示错误

    error_reporting:显示什么级别的错误

    2、在运行的PHP脚本中去设置:在脚本中定义的配置项级别比配置文件高(通常在开发当中都会在代码中去进行控制和配置)

    error_reporting;设置对应的错误显示级别

    ini_set(‘配置文件中的配置项’,配置值)

    ini_set(‘error’,E_ALL);

    ini_set(‘display_errors’,1);

    错误日志设置

    在实际生产环境中,不会直接让错误赤裸裸的展示给用户:

    1、不友好

    2、不安全,错误会暴露网站很多信息(路径、文件名)

    但错误不可能避免,又希望捕捉到让后台程序员去修改:需要保存到日志文件中,需要在PHP配置文件中或者代码中(ini_set)设置对应的error_log配置项。

    1、开启日志功能

    2、指定路径

    自定义错误处理

    最简单的错误处理:trigger_errors()函数,但是该函数不会阻止系统报错。

    PHP系统提供了一种用户处理错误的机制:用户自定义错误处理函数,然后将该函数增加到系统错误处理的句柄中,然后系统会在碰到错误之后,使用用户定义的错误函数。

    1、如何将用户自定义的函数放到系统中?set_error_handler()

    2、自定义错误处理函数,系统有要求。

    代码实现:

     1 <?php
     2     //自定义错误处理机制
     3     /*
     4      @param1 $errno 是系统提供的错误代码:E_ALL,E_NOTICE
     5      */
     6     //自定义函数
     7     function my_error($errno,$errstr,$errfile,$errline){
     8         //判断:当前会碰到的错误有哪些
     9         if(!(error_reporting() & $errno)) {   //error_reporting没有参数代表获取当前系统错误处理对应的级别
    10                 return false;//系统中不存在则不能处理
    11         }   
    12         
    13         //开始判断错误类型
    14         switch ($errno){
    15             case  E_ERROR:
    16             case E_USER_ERROR:
    17                 echo 'fatal error in file "' . $errfile . '" on line' . $errline . '<br />';
    18                 echo  'error info :' . $errstr;
    19                 break;
    20             case  E_WARNING:
    21             case E_USER_WARNING:
    22                 echo 'Warning error in file "' . $errfile . '" on line' . $errline . '<br />';
    23                 echo  'error info :' . $errstr;
    24                 break;
    25             case  E_NOTICE:
    26             case E_USER_NOTICE:
    27                 echo 'Notice error in file "' . $errfile . '" on line' . $errline . '<br />';
    28                 echo  'error info :' . $errstr;
    29                 break;      
    30         }
    31         
    32         return true;
    33     }
    34     
    35     //报错
    36     //echo $a;
    37     
    38     //修改错误机制
    39     set_error_handler('my_error');
    40     
    41     echo $a;
    View Code

    当前属于简单自定义模式,如果要复杂,可以在某些影响代码功能的错误发生后,让用户跳转到某个指定界面。

  • 相关阅读:
    网络协议 22
    网络协议 21
    网络协议 20
    网络协议 19
    网络协议 18
    网络协议 17
    网络协议 16
    网络协议 15
    网络协议 14
    .net 4.0 中的特性总结(五):并行编程
  • 原文地址:https://www.cnblogs.com/sun-yanglu/p/9543466.html
Copyright © 2020-2023  润新知