PHP错误处理

    xiaoxiao2022-07-07  219

    一、错误处理概述

    1.常见的错误类型

    在PHP中,错误用于指出语法、环境或编程问题。根据错误出现在编程过程中的不同环节,大致可以分为以下4类:语法错误、运行错误、逻辑错误、环境错误。

    语法错误:是指编写的代码不符合PHP的编写规范。 特点:语法错误最常见,也最容易修复 例如:遗漏了一个分号,就会显示错误信息。这类错误会阻止PHP脚本执行,通常发生在程序开发时,可以通过错误报告进行修复,再重新运行检查。

    运行错误:一般不会阻止PHP脚本的执行,但会导致程序出现潜在的问题。 例如:在一个脚本中定义了两次同名常量,PHP通常会在第二次定义时提示一条错误信息。虽然PHP脚本继续执行,但第二次定义常量的操作没有执行成功。

    逻辑错误:最让人头疼,不但不会阻止PHP脚本的执行,也不会显示出错误信息 例如:在if语句中判断两个变量的值是否相等,如果错把比较运算符“==”写成赋值运算符“=”就是一种逻辑错误,很难被发现。

    环境错误:是由于PHP开发环境配置的问题引起的代码报错 例如:用mb_strlen()这个函数时,如果PHP环境中没有启用mbstring扩展,就会导致程序出错。

    2.错误级别

    PHP中的每个错误都有一个错误级别与之关联,用于表示当前错误的等级。例如Error、Warning、Notice等错误。PHP采用常量的形式来表示错误级别,每个错误级别都是一个整型。

    ①Fatal Error:致命错误(脚本终止运行)

    级别常量

    描述

    E_ERROR

    1

    致命的运行时错误,这类错误不可恢复,会导致脚本停止运行

    E_CORE_ERROR

    16

    类似E_ERROR,是由PHP引擎核心产生的;

    PHP启动时初始化过程中的致命错误

    E_COMPILE_ERROR

    64

    类似E_ERROR,是由Zend脚本引擎产生的

    编译时致命性错,就像由Zend脚本引擎生成了一个E_ERROR

    E_USER_ERROR

    256

    类似E_ERROR,由用户在代码中使用trigger_error()产生的

    自定义错误消息。像用PHP函数trigger_error(错误类型设置为:E_USER_ERROR

     

     

    ②Parse Error:编译时解析错误,语法错误(脚本终止运行)

    级别常量

    描述

    E_PARSE

    4

    编译时语法解析错误,说明代码存在语法错误,无法执行

     

     

    ③Warning Error:警告错误(仅给出提示信息,脚本不终止运行)

    级别常量

    描述

    E_WARNING

    2

    运行时警告,仅提示信息,但是脚本不会停止运行;非致命错误

    E_CORE_WARNING

    32

    类似E_WARNING,是由PHP引擎核心产生的

    PHP初始化启动过程中发生的警告 (非致命错误

    E_COMPILE_WARNING

    128

    类似E_WARNING,是由Zend脚本引擎产生的

    编译警告

    E_USER_WARNING

    512

    类似E_WARNING,由用户在代码中使用trigger_error()产生的

    用户产生的警告信息

     

     

     ④Notice Error:通知错误(仅给出通知信息,脚本不终止运行)

    级别常量

    描述

    E_NOTICE

    8

    运行时通知,表示脚本遇到可能会表现为错误的情况

    E_USER_NOTICE

    1024

    类似E_NOTICE,由用户在代码中使用trigger_error()产生的

    用户产生的通知信息

    //①使用未定义的变量 echo $var; //提示信息“Notice:Undefined variable...” //②使用未定义的常量 echo PI; //提示信息“Notice:Use of undefined constant...” //③访问不存在的数组元素 $arr=array(); echo $arr['age'];//提示信息“Notice:Undefined index:age...”

    遇到Notice提示信息通常是代码不严谨造成的,不会影响脚本继续运行。 

     Warning错误级别相比Notice更严重一些,不会影响脚本继续执行。

    //①除法运算错误时,除数为0 echo 5/0; //提示信息“Warning:Division by zero...” //②使用include包含不存在的文件 include '1234'; //提示信息“Warning:include():Failed opening...”

    除法运算前,可以使用if判断除数是否为0,若为0则拒绝执行除法运算

    使用include前,先用is_file()函数判断该文件是否存在,防止错误发生 

     Fatal error是一种致命错误,在运行时发生。一旦发生该错误,PHP脚本会立刻停止执行。例如,调用未定义的函数时就会发生致命错误,示代码如下。

    display(); //Fatal error: Uncaught Error:Call to undefined function... echo 'test'; //前一行发生错误,此行代码不会执行

    Parse error是语法解析错误,当脚本存在语法错误时,无法解析成功,就会发生此错误。遇到此错误说明脚本没有执行。

     

    //①除法运算时,除数为0 echo 5/0;//提示信息“Warning:Division by zero...” //②使用include包含不存在的文件 include'1234';//提示信息“Warning:include():Failed opening...”

    对于这类错误,可以借助代码编辑器的语法高亮和检查功能,以提醒开发人员避免语法出错。

    3.手动触发错误

    E_ERROR、E_NOTICE、E_WARNING等错误都是由PHP解释器自动触发的PHP解释器自动触发的错误外,还可以根据不同的需求自定义错误,它们可以用于协助调试,或在发布给其他人的代码中生成不推荐使用的通知等

     PHP的内置函数trigger_errorQ可以触发错误,该函数声明如下:

    bool trigger_error(string $error_msg [int $error_type =E_USER_NOTICE])

    >第1个参数是错误信息内容

    error_reporting(E_ALL&~E_NOTICE);ini_set('display_errors',1);

    >第2个参数是错误类别,默认为E_UESR_NOTICE

    二、如何处理错误

    1.显示错误报告

    在实际开发过程中,不可避免的会出现各种各样的错误,为了提高开发效率,PHP语言提供了显示错误的机制,该机制可以控制是否显示错误以及显示错误的级别等。在默认情况下,会将所有的错误显示在输出结果中。

    error_reporting()和ini_set()函数通过PHP提供的error_reporting()和ini_set)函数来实现显示错误报告。

    >ini_set()函数用来设置php.ini中指定选项的值,仅在本脚本周期内有效 >error_reporting()函数用于设置错误级别 >若要获取php.ini中的指定选项值,可以使用ini_get()函数进行获取

    2.记录错误日志

    修改配置文件通过修改php.ini配置文件,可以直接设置记录错误日志的相关配置项  ​error_reporting=E_ALL log_error=On error_log =C:\web\php_errors.log

     

    >error_reporting用于设置显示错误级别 >E_ALL表示显示所有错误 >log_error用于设置是否记录日志 >error_log用于指定日志写入的文件路径

     error_log()函数error_log)函数用于将错误记录到指定的日志文件中

    //将错误信息发送到php.ini中的error_log配置的日志中 error_log("error message a"); //将错误信息发送到指定日志文件中 error_log('error message b',3,'C:/web/php.log');

    >第2个参数用于指定将错误信息发送到何处,当省略时默认为php.ini中的error_log配置的日志中,此处设置为3,表示发送到指定的日志文件中。

    3.自定义错误处理器

    当一个错误发生时,PHP会采取默认方式进行处理。当需要更改错误处理方式时,可以在PHP脚本中设置一个自定义错误处理器,实现在错误发生时自动调用一个函数进行处理。

    自定义错误处理器是通过set_error_handler()函数来实现的,其函数声明如下:

    mixed set_error_handler(callable $error_handler [int $error_types=E_ALLI E_STRICT])

    >callable表示参数$error_handler为回调函数类型 >$error_handler是必选参数,用于指定发生错误时运行的函数 >$error_types用于指定处理错误的级别类型

    $error_handler回调函数的参数必须符合错误处理器函数的原型  

    function handler(int $errno,string $errstr[,string $errfile [,int $errline [,array $errcontext]]]);

    >参数$errno表示错误级别 >Serrstr表示错误说明 >Serrcontext表示在触发错误的范围内存在的所有变量的数组。其中前两个参数是必选参数。

    最新回复(0)