先上代码:
set_error_handler(function ($errno, $errstr, $errfile, $errline) {
var_dump('我是下面程序还没有运行前系统充当默认的异常处理函数,下面程序在捕捉到了自己的异常后需要恢复(restore_error_handler)我这个异常捕捉函数');
});
/**
* @param callable $errno 必须。错误级别,是一个integer
* @param string $errstr 必须。错误信息,是一个string
* @param string $errfile 可选。错误的文件名,是一个string
* @param string $errline 可选。错误的行号, 是一个integer
* @throws Exception 异常对象
* @return void | boolean 返回值为false,系统就会追加异常
*/
function errorHandle($errno, $errstr, $errfile, $errline){
throw new Exception("故意在这里再次抛出异常,然后你用try,catch就可以接收了".$errstr.$errfile);
}
/**
* @return void
*/
function errorReport(){
set_error_handler('errorHandle');
$a = 0;
$b = 11 / $a;
}
try{
//报错函数,有时候程序报出得错误 Exception 是捕捉不到的,try,catch只能捕捉我们程序自己主动抛出的错误,比如 throw new Exception("我是主动抛出的")
//这个时候如果我们还想捕捉错误,就是本文想要表达的
//set_error_handler能够帮助我们捕获大部分,但其实 set_error_handler 能够捕捉的错误也是有限的,
//如果你想知道实实在在的哪些被捕捉了,哪些可能捕捉不到,这个时候你就需要取了解php错误的类型列表了 @移步 https://www.cnblogs.com/zyf-zhaoyafei/p/6928149.html?from=timeline
// 里面请重点关照 error_reporting(), register_shutdown_function(),set_error_handler(),set_exception_handler()
$a = 1;
if($a == 2){
restore_error_handler(); //该函数在退出之前我们得恢复到之前的异常处理机制,所以每一处退出行为之前,都得执行它
return false;
}
$g = errorReport();
}catch (Exception $e){
restore_error_handler();//这个是 函数恢复之前的错误处理程序。有时候我们在程序中只是为了保证当前函数错误可控,又不能影响到全局异常,那么这个函数登场了
var_dump($e->getMessage());
}
总结:
1.在php中我们平常用的try,catch只能捕获我们主动抛出的异常,当然除非你的框架已经帮你把异常捕获处理得能够通过try,catch去捕获所有错误了,那也只能说明你是在框架布好的"局"中在写代码.那如果有一天你自己需要写composer包了呢,是不是得了解点,让包健壮点,不然谁该用你的包撒
2.set_error_handler(),能够帮我们主动去捕获一些异常(这里说的主动是你代码在你不知情的情况下报错了,而非throw new Exception 你知道错了手动主动抛出),它和restore_error_handler()可打配合。
3.error_reporting(0),可以让我们的代码在执行过程中遇错了也不往上抛了,从而达到完全全面的接管错误处理
4.register_shutdown_function(),你语法上的错误它也能捕获
5.说来说去,就是不同的错误php会有不同的对待方式,如果你要结管,自己管(好处就是你可以自定义对外输出格式,从而实时让你的程序可控,及健壮),就去要去了解php对待该种错误的方式,意思就是有哪个函数可以接管该异常情况。
点击查看借阅文章
网友评论