2016/08/07

php错误异常


先来看一下PHP中的含有哪些错误级别

编号 常量 描述
1 E_ERROR 致命的运行错误
2 E_WARNING 运行时警告
3 E_PARSE 编译时解析错误
4 E_NOTICE 运行时提醒
16 E_CORE_ERROR PHP启动时初始化过程中的致命错误
32 E_CORE_WARNING PHP启动时初始化过程中的警告(非致命性错)
64 E_COMPILE_ERROR 编译时致命性错
128 E_COMPILE_WARNING 编译时警告(非致命性错)
256 E_USER_ERROR 用户自定义的错误消息(由调用trigger_error产生)
512 E_USER_WARNING 用户产生的警告信息(由调用trigger_error产生)
1024 E_USER_NOTICE 用户产生的提醒信息(由调用trigger_error产生)
2047 E_ALL 所有的错误和警告(不包括 E_STRICT)
2048 E_STRICT 编码标准化警告,允许PHP建议如何修改代码以确保最佳的互操作性向前兼容性

开启错误日志存储

ini_set('log_errors', 1);

将错误日志存储到指定文件

ini_set('error_log', './error_log.dat');

是否将错误日志输出到屏幕中

ini_set('display_errors', 0);

设置错误级别 0不处理 -1处理所有

// 经常见到 error_reporting(7) 直意为:设定错误讯息回报的等级。
// 7 = 1 + 2 + 4
// 就是出错时显示 1 E_ERROR 2 E_WARNING 4 E_PARSE
error_reporting(-1);

自定义错误处理函数

function _error_handler($errno, $errstr, $errfile, $errline) {
    echo 'error: '.$errno." ".$errstr." ".$errfile." ".$errline."\n";
}

// 自定义错误处理 使用了该函数后, 会完全绕过标准的 PHP 错误处理函数.
// 如 error_reporting(), display_errors, error_log 将失效.
// 也就是说所有的错误都会交给自定义的函数处理
set_error_handler('_error_handler');

定义PHP程序结束前回调函数

function _shutdown_handler() {
    echo "shutdown...\n";
    $check_error = E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING;
    $last_error = error_get_last();
    if (isset($last_error) && ($last_error['type'] & $check_error)) {
        _error_handler($last_error['type'], $last_error['message'], $last_error['file'], $last_error['line']);
    }
}

// 当我们的脚本 执行完成 或 意外死掉 导致PHP执行即将关闭时,此函数将会被调用
register_shutdown_function('_shutdown_handler');

自定义异常捕获

function _exception_handler($exception) {
    echo 'exception: '.$exception->getCode()." ".$exception->getMessage().
        " ".$exception->getFile()." ".$exception->getLine()."\n";
}

// 设置默认的异常处理程序, 用于没有用 try/catch 块来捕获的异常
set_exception_handler('_exception_handler');

用户主动出发一个错误

// 由用户自主产生的 错误/警告/注意 信息, 用于主动触发一个错误, 它与内建的错误处理器一同使用, 产生的信息会
// 传给错误处理器进行处理
// error_type: E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE. 如果传入其他 error_type,则错误处理器
// 会输出 E_WARNING 警告
// trigger_error(string errorMsg[,int user_error_type])
trigger_error("i am a trigger error", E_USER_NOTICE);

异常处理的基本思想是代码在try代码被调用执行. 如果try码块出现错误, 我们可以执行一个抛出异常的处理. 某些编程语言,如java,在特定情况下将自动抛出异常. 在php中,异常必须手动抛出.

try {
    throw new Exception('this exception in try catch');
} catch(exception $e) {
    echo "i get the exception in catch\n";
}

如果主动抛出异常不在 try/catch 中,则会调用自定义 set_exception_handler. 如果不存在自定义异常函数,则会报 "Uncaught exception 'Exception'" 致命错误(E_ERROR)

throw new Exception('this exception not in try catch');