PHP错误与异常

一、错误

错误类型
1. 语法错误
Deprecated 最低级别的错误(代表不推荐)
例:高版本PHP使用mysql函数 (使用mysqli或PDO替换)

Notice 通知(注意)级别的错误(并不影响程序继续执行)
例:echo $a; //直接输出一个未定义的变量

Warning 警告级别的错误
例:settype($var, 'test'); //设置一个不存在的变量类型

fatal 致命级别的错误(程序终止执行)
例:md6('test'); //调用一个未定义的函数

parse error 语法解析错误(在语法检查阶段,优先于以上所有错误,直接终止执行)
例:echo 'test' //缺少 ; 语法错误

E_USER_相关的错误 (用户产生的错误)

2. 环境错误
由于运行环境所引起的错误

3. 逻辑错误
业务逻辑产生的错误

PHP配置文件中与错误相关选项
    1. error_reporting  设置错误报告的级别
    2. display_errors   是否显示错误
    3. log_errors       设置是否将产生错误信息记录到日志或error_log中
    4. error_log        设置脚本错误将记录到的文件
    5. log_errors_max_len 设置 log_errors 的最大字节数
    6. ignore_repeated_errors 是否忽略重复的错误信息
    7. ignore_repeated_source 是否忽略重复错误信息的来源
    8. track_errors 如果开启此项,最后一个错误将永远保存在$php_errormsg中

设置错误级别
1. 修改配置文件中error_reporting选项

2. 动态设置设置错误级别(无法屏蔽语法解析错误)
error_reporting()
error_reporting('E_ALL') //显示所有错误
error_reporting('E_ALL&~E_NOTICE') //除notice级别显示所有错误
error_reporting(0) //不显示所有错误

3. 运行时设置配置选项的值
ini_set()
ini_set('error_reporting', 0); //不显示所有错误
ini_set('display_errors', 0); //不显示所有错误

@符号抑制错误输出
例: @settype($var, 'test');

通过trigger_error()触发PHP用户自定义错误
例:echo trigger_error('测试抛出一个notice错误', E_USER_NOTICE); //抛出一个通知级别的错误
    echo trigger_error('测试抛出一个warning错误', E_USER_WARNING); //抛出一个警告级别的错误

错误处理

1. 记录错误日志
    设置PHP配置文件
    log_errors=No #开启错误日志
    error_log=C:\err_logs\err.log  #设置脚本错误将记录到的文件

    ini_set 动态设置
    ini_set('log_errors', 1) #开启错误日志
    ini_set('error_log','C:\err_logs\err.log') #设置脚本错误将记录到的文件

    方式1 记录到错误日志
    error_log($message); //可以写入错误日志信息
    方式2 记录到系统日志
    ini_set('error_log','syslog');
    方式3 发送邮件
    error_log($message, 1, '[email protected]');

    其他选项
    log_errors_max_len 设置 log_errors 的最大字节数
    ignore_repeated_errors 是否忽略重复的错误信息
    ignore_repeated_source 是否忽略重复错误信息的来源
    track_errors 如果开启此项,最后一个错误将永远保存在$php_errormsg中

自定义错误处理器
    set_error_handler() 此方法不返还false则默认绕过php内置错误处理
    例:
    header('content-type:text/html;charset=utf-8');
    error_reporting(-1);
    function customError($errno, $errmsg, $file, $line) {
        echo "错误代码: [{$errno}] {$message}
".PHP_EOL; echo "错误行号: [{$file}] 文件中第 {$line} 行
".PHP_EOL; echo "PHP版本: ".PHP_VERSION."
".PHP_EOL; echo "系统: ".PHP_OS."
".PHP_EOL; die(); } set_error_handler('customError', E_ALL); echo $test; //测试 输出一个未定义变量错误 trigger_error('this is a test of error', E_USER_ERROR); //抛出用户设置致命错误 echo "
"; echo 'continue...'; restore_error_handler();//取消错误接管

二、异常

try{
    代码段;
    throw new Exception() 抛出异常
}catch(Exception $e){     捕获异常
    $e->getMessage();
    try{
        throw new Exception() 继续抛出异常
    }catch(Exception $e){ 
        $e->getMessage();
    }
}

自定义异常类
1.需要继承基类 Exception
2.只能重写 构造函数和to_string函数
class MyException extends Exception {
    public function __construct($msg) {
         parent::__construct($msg);
    }
    public function __toString() {
        echo "this is a test";
    }
}

try{
    throw new MyException('test');
}catch(MyException $e) {
    echo $e;
}catch(Exception $e) { //一般将基类放到最后
    echo $e->getMessage();
}

自定义异常处理器
set_exception_handle($function)
set_exception_handle(类名,静态方法)
restore_exception_handler() 恢复上一次定义的处理器

你可能感兴趣的:(php,php)