先来看一下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');