扩展:PHP错误与异常
错误与异常的概念
异常:在程序运行过程中不符合正常业务逻辑的错误,属于业务逻辑的错误。
错误:脚本本身的错误,多位语法错误、服务器环境错误。
错误的级别
Fatal Error:致命错误(脚本终止运行)
E_ERROR // 致命的运行错误,错误无法恢复,暂停执行脚本
E_CORE_ERROR // PHP启动时初始化过程中的致命错误
E_COMPILE_ERROR // 编译时致命性错,就像由Zend脚本引擎生成了一个E_ERROR
E_USER_ERROR // 自定义错误消息。像用PHP函数trigger_error(错误类型设置为:E_USER_ERROR)
Parse Error:编译时解析错误,语法错误(脚本终止运行)
E_PARSE //编译时的语法解析错误
Warning Error:警告错误(仅给出提示信息,脚本不终止运行)
E_WARNING // 运行时警告 (非致命错误)。
E_CORE_WARNING // PHP初始化启动过程中发生的警告 (非致命错误) 。
E_COMPILE_WARNING // 编译警告
E_USER_WARNING // 用户产生的警告信息
Notice Error:通知错误(仅给出通知信息,脚本不终止运行)
E_NOTICE // 运行时通知。表示脚本遇到可能会表现为错误的情况.
E_USER_NOTICE // 用户产生的通知信息。
相关配置
display_errors : true | false
设置错误信息显示
error_reporting : integer
设置错误显示类型
自动捕获函数
自动捕获warning与notice等错误
set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed
注册错误处理函数,注册错误处理函数后,$error_types指定的错误类型将绕过PHP标准错误处理程序,即display_errors与error_reporting配置项无效,除非回调函数返回false;
E_ERROR、 E_PARSE等错误不能由回调函数处理
set_error_handler('error_handler');
function error_handler($type, $message, $file, $line){
...
}
自动捕获pares error 与fatal error等错误
register_shutdown_function ( callable $callback [, mixed $parameter [, mixed $... ]] ) : void
捕获PHP的Fatal Error、Parse Error等错误,PHP脚本执行结束前最后一个调用注册的回调函数,比如脚本错误、die()、exit、正常结束都会调用,配合error_get_last()函数获取错误信息
error_reporting(0);//设置-1,则优先显示debug信息,然后交由回调函数处理,生产环境关闭error_reporting
register_shutdown_function('shutdown_handler');
function shutdown_handler(){
if ($error = error_get_last()) {
...
}
}
//引入文件,处理文件中的脚本错误
require_once 'parse_error.php';
特别说明,对与语法解析错误,应该确保注册回调函数的当前脚本文件误语法错误,因为语法解析器优先执行,如果当前文件发生语法错误,则不会执行到register_shutdown_function(),在注册回调函数后,通过require引入到文件语法解析过程中发生错误则可以交由回调函数处理。
自动捕获异常
set_exception_handler ( callable $exception_handler ) : callable
捕获未被try/catch处理的异常
set_exception_handler('exception_handler');
function exception_handler($exception){
echo $exception->getMessage()."\n";
}
throw new Exception('Exception occur');
如果未注册异常捕获函数,则异常未捕获会触发Fatal Error错误
HandleExceptions
bootstrap()
//class HandleExceptions
public function bootstrap(Application $app)
{
$this->app = $app;
//设置错误显示类型
error_reporting(-1);
//设置warning,notice自动捕获函数
set_error_handler([$this, 'handleError']);
//设置异常自动捕获函数
set_exception_handler([$this, 'handleException']);
//设置fatal error,prase error自动捕获函数
register_shutdown_function([$this, 'handleShutdown']);
}
设置自动捕获错误与异常函数,具体的函数使用的类库及相应机制这里就不探究了!