青风百里

PHP 错误处理
一.错误的分类编译错误:编译过程中发生的错误,大多数是由于书写错误导致的<?php functio test...
扫描右侧二维码阅读全文
30
2018/09

PHP 错误处理

一.错误的分类

  • 编译错误:编译过程中发生的错误,大多数是由于书写错误导致的
<?php
functio test(){

}

  • 执行错误:编译通过后,在执行阶段发生的错误,此种错误一旦发生, 会根据错误的等级来决定是否中断程序
  • 逻辑错误:人为的错误,比如死循环,此种错误最难排查,俗称bug......

二.错误代码

  • 在php的错误处理机制中,每一种错误都是用了一个错误标识,错误标识以常量的形式存在,可以使用系统函数get_defined_constants()打印出来看看
<?php
echo "<pre>";
print_r(get_defined_constants());
echo "</pre>";

  • 这些错误代码可以分为:系统错误,废弃错误,核心错误,用户错误(自定义错误),所有错误

系统错误

    [E_ERROR] => 1//致命错误,发生就中断程序
    [E_RECOVERABLE_ERROR] => 4096
    [E_WARNING] => 2//警告错误,发生不会中断程序
    [E_PARSE] => 4//编译错误(语法错误),发生会中断程序
    [E_NOTICE] => 8//提示错误,发生不中断程序,会给个提示
    [E_STRICT] => 2048

用户错误

    [E_USER_ERROR] => 256//致命错误,发生就中断程序
    [E_USER_WARNING] => 512//警告错误,发生不会中断程序
    [E_USER_NOTICE] => 1024//提示错误,发生不中断程序,会给个提示
    [E_USER_DEPRECATED] => 16384

废弃错误

  • 低版本向高版本兼容的时候,有些函数会被废弃
[E_DEPRECATED] => 8192

核心错误

  • php原码的错误
    [E_CORE_ERROR] => 16
    [E_CORE_WARNING] => 32
    [E_COMPILE_ERROR] => 64
    [E_COMPILE_WARNING] => 128

所有错误

    [E_ALL] => 32767

三.错误的触发

系统错误的触发

  • 系统错误的触发,不能人为干涉,由系统自己检测并触发

用户自定义错误的错发

  • trigger_error()

    • 描述:产生一个用户级别的 error/warning/notice 信息
    • 语法:bool trigger_error ( string $error_msg [, int $error_type = E_USER_NOTICE ] )
  • 参数说明:

    • $error_msg:错误描述信息
    • $error_type:特定的错误类型(E_USER_WARNING,E_USER_ERROR,E_USER_NOTICE),仅 E_USER 系列常量对其有效,默认是 E_USER_NOTICE
  • 下面的代码,人为的给出一个提示,并没有走错误处理机制
<?php
function test($arr){
    if (!is_array($arr)){
        echo "传入的不是一个数组";
    }else {
        foreach ($arr as $v) {
            echo $v . '<br>';
        }
    }
}
$arr = 1;
test($arr);

  • 改写代码,走错误处理机制,好处是Apache可以记录这些错误信息,在我的mac上,会记录在ErrorLog "/private/var/log/apache2/error_log"这里
<?php
function test($arr){
    if (!is_array($arr)){
        trigger_error("传入的不是一个数组", E_USER_NOTICE);
    }else {
        foreach ($arr as $v) {
            echo $v . '<br>';
        }
    }
}
$arr = 1;
test($arr);
echo "测试信息";

  • 如果定义为error级别,"测试信息"这句话就不会输出了
<?php
function test($arr){
    if (!is_array($arr)){
        trigger_error("传入的不是一个数组", E_USER_ERROR);
    }else {
        foreach ($arr as $v) {
            echo $v . '<br>';
        }
    }
}

//$arr = [1,2,3,4,5];
$arr = 1;
test($arr);
echo "测试信息";

四.错误的控制设置

  • 在php.ini中,可以控制错误是否显示,也可以控制显示哪一类的错误,还可以控制错误日志的位置

控制是否显示错误

  • display_error=on/off

控制显示哪一类错误

  • ini_set('error_reporting', E_NOTICE | E_WARNING),这个再学吧,先了解一下
Last modification:September 30th, 2018 at 04:42 pm

Leave a Comment