错误处理

错误分类

分类
语法错误 立即报错,并不会执行
运行时错误 运行程序中遇到的错误 分类:提示错误、警告错误、致命错误
逻辑错误

错误分级

系统常量:

E_ERROR = 1, 致命错误
E_WARNING=2, 警告性错误
E_NOTICE=8 提示性错误
E_USER_NOTICE=1024,
E_ALL=30719

错误的触发

系统触发

程序运行到某个时刻,确实出现了某种错误,此时系统就会报错

系统触发的典型错误:

E_ERROR = 1, 致命错误:导致无法执行后续语句。 比如一个不存在的函数
E_WARNING=2, 警告性错误:输出错误提示并继续执行后续代码。如:引入不存在的文件
E_NOTICE=8 提示性错误:输出错误提示并继续执行后续代码。如:使用不存在的变量、常量

自定义触发

trigger_error("错误信息",错误代号)

异常数据处理:

if (...){
    trigger_error("错误信息",E_USER_ERROR)
}
//后续不会执行。因为触发的是自定义的"致命错误"

错误的显示和记录

是否显示

有两种方法设定是否显示。

  1. php.ini文件中,设定diplay_errors的值 on/off。 前提是我们apache已经装了php.ini文件,这一点需要在apache的配置文件httpd.config中加入如下一行: PHPIniDir:“php.ini文件的路径位置"
  2. 直接在php的脚本文件中使用函数 ini_set()函数设置,只影响该脚本代码。
ini_set('display_errors',0);

脚本中的设置优先于php.ini的设置

显示哪些错误报告

前提设置显示errors。

  1. php.ini文件中设置 error_reporting

    ; Examples:
    ;
    ;   - Show all errors, except for notices
    ;
    ;error_reporting = E_ALL & ~E_NOTICE
    ;
    ;   - Show only errors
    ;
    ;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
    ;
    ;   - Show all errors except for notices
    ;
    error_reporting  =  E_ALL
    

    显示严重的 E_ERROR | E_USER_ERROR 显示全部错误 E_ALL | E_STRICT (不是很懂,为什么all不是all?)

  2. 当前的脚本中设置

日志的记录问题

是否记录

  1. log_errors = On
  2. 脚本中ini_set('log_errors',1)

记录到哪里:

只有两个写法:

  1. 直接使用文件名,此时系统会自动在每个文件夹下建立该文件名,并且记录该文件夹下所有网页文件发生的错误信息。 ini_set('error_log',"my_error.txt")
  2. 使用特殊的名字error_log('你要输出的信息', 3, 'log文件路径');

error handler

  1. 设定处理错误的函数名 set_error_handler('函数名')
  2. 定义这个函数
set_error_handler('f1'); 

...

function f1(){ 
    echo "我擦程序出错了"
}

//定义是个形参
//错误代号(级别)、 错误内容 、发生错误的文件名、发生错误的行号
//错误发生时,会自动调用并传入4个参数
function my_error_handler($errorCode,$errorMsg,$errFile,$errLine){

}