php错误处理之set_exception_handler
发布于 作者:苏南大叔 来源:程序如此灵动~大家好,本次苏南大叔给大家带来的是一个有关php错误处理的教程,说的是php的异常处理函数set_exception_handler
。
在开始本文的内容之前,建议大家先复习一下这篇文章:https://newsn.net/say/php-ini-error.html ,看看最传统的php的错误处理方案,然后再回头看看本文中的内容。也许会有更深刻的认识。
前言
本文的内容适合在php脚本内容中,控制错误输出。php的各种框架中,都会出现这个函数set_exception_handler
。
在php语言自身的概念内,error和exception是两个概念,而在大家的意识里面,这两个可能是同一个概念,都是“报错”。这点可能需要大家先弄弄清。而php5和php7对于set_exception_handler
函数的解释也是不同的,具体的区别在哪里呢?请查看下面的内容。
范例代码
下面的是苏南大叔为大家编写的,本文的讲解demo范例。
echo "PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
function exception_handler($exception) {
$errno = $exception->getCode();
$errstr = $exception->getMessage();
$errfile = $exception->getFile();
$errline = $exception->getLine();
$errtrace = $exception->getTraceAsString();
echo "<b>出错了,错误如下:</b><br/><br/>";
echo "代码: $errno <br />\n";
echo "信息: $errstr <br />\n";
echo "文件: $errfile <br />\n";
echo "行号: $errline <br />\n";
echo "trace: $errtrace <br />\n";
//exit();
}
set_exception_handler('exception_handler');
//throw new Exception('这是个自定义异常exception');
//throw new Exception('这是个带编号的自定义异常exception',1);
//trigger_error("这是个无法捕捉的自定义的错误error");
//throw new Error('这是个带编号的自定义的错误error',2);
//this_is_an_on_purpose_error();
echo "恭喜,没有错误\n";
在这个范例中,苏南大叔将要演示,在php5、php7中,对于set_exception_handler
的不同处理结果。
没有自定义错误处理函数时的截图
作为后文的对比,这里先展示些这些截图,显示系统默认对错误异常的处理情况。
php7
中的set_exception_handler
在php7中,set_exception_handler
函数,
- 可以处理throw的exception和error,显示出一个错误后,自动停止响应。
- 但是无法处理通过
trigger_error
触发的error,归于系统处理,并会继续执行。
php5
中的set_exception_handler
在php5
中,set_exception_handler
函数,
- 可以处理throw的
exception
,显示出一个错误后,自动停止响应。 - 但是无法处理任何的
error
,归于系统处理,并会继续执行。 - php5中没有
error
这个类,无法throw一个Error
,但是可以throw一个Exception
。
总结
set_exception_handler
这个函数,在php5和php7中,表现出较大差别。触发错误的方式不同,在php中也可能表现出不同的形式。php7中的set_exception_handler
,可以捕获error和exception,php5中的set_exception_handler
,只可以捕获exception。
无法捕获的错误和异常,将进入php系统处理。如果你设置了php.ini中的错误处理方式,那么你将可以在你可以期待的地方,看到这些没有被捕获的错误的描述信息。
总体来说,除了trigger_error
之外,错误都是可以捕获的。但是对于error
,在php5中,是通过另外的函数set_error_handler
进行捕获的。在接下来的文章中,苏南大叔将会和大家探讨set_error_handler
的使用。
更多苏南大叔的php相关的经验总结,请点击这里查看:https://newsn.net/tag/php/ 。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。