PHP错误、异常汇总
Error
Error级别
Fatal Error:致命错误(脚本终止运行)
E_ERROR 致命的运行时的致命错误,终止程序执行
E_CORE_ERROR PHP 启动时的致命错误
E_COMPILE_ERROR PHP编译时的致命错误
E_USER_ERROR 用户产生的致命错误
Parse Error:编译时的解析错误(脚本终止运行)
Parse Error 编译时的语法解析错误
Warning Error:警告错误(仅给出提示信息,但是脚本不会终止运行。)
E_WARNING 运行时警告 (非致命错误)。
E_CORE_WARNING PHP初始化启动过程中发生的警告 (非致命错误) 。
E_COMPILE_WARNING 编译警告
E_USER_WARNING 用户产生的警告信息
Notice Error:通知错误(仅给出通知信息,但是脚本不会终止运行。)
E_NOTICE 运行时通知。表示脚本遇到可能会表现为错误的情况.
E_USER_NOTICE 用户产生的通知信息。
set_error_handler()捕获错误【有局限】
函数说明
set_error_handler($callback);//设置一个用户的函数(error_handler)来处理脚本中出现的错误。
函数的局限性
以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。
也就是:set_error_handler($callback)只能捕获系统产生的一些Warning、Notice级别的Error。
使用方法
输出结果:
"errno":8"errstr":Undefined variable: test"errfile":/Users/shuchao/Desktop/handler.php"errline":13 如何捕获PHP的Fatal Error、Parse Error等需求描述
获取PHP的fatal error,比如记录到Log里面,利于我们分析线上问题,可以做线上服务的监控。
两个函数
register_shutdown_function()
register_shutdown_function($callback)
register_shutdown_function(),就把你要注册进去的function放进【假装是队列吧】,等到脚本正常退出或显示调用exit时,再把注册进去的function拉出来执行.
register_shutdown_function()调用的3种情况:
脚本正常退出时;
在脚本运行(run-time not parse-time)出错退出时;
用户调用exit方法退出时。
error_get_last()
error_get_last();//函数获取最后发生的错误。
该函数以数组的形式返回最后发生的错误。
返回的数组包含 4 个键和值:
[type] - 错误类型
[message] - 错误消息
[file] - 发生错误所在的文件
[line] - 发生错误所在的行使用方法
强烈注意
在parse-time出错的时候,是不会调用register_shutdown_function()函数的。只有在run-time出错的时候,才会调用register_shutdown_function()。
下面我们举例说明:
NO.1
error_handler.php
执行结果如下:
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/error_handler.php:6) in/Users/shuchao/Desktop/error_handler.php on line 7
原因分析
在执行error_handler.php的时候,由于重复定义了两个函数test(),在php的parse-time就出错了(不是run-time),所以不能回调register_shutdown_function()中的函数。
NO.2
error_handler.php
执行结果如下:
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/error_handler.php:9) in /Users/shuchao/Desktop/error_handler.php on line 7Yeah,it's worked!%原因分析
我们看到,上面回调了register_shutdown_function().
因为我们加了一个if()判断,if()里面的test()方法,相当于一个闭包,与外面的test()名称不冲突。
也就是,上面的代码在parse-time没有出错,而是在run-time的时候出错了,所以我们能够获取到fatal error。NO.3
error_handler.php
执行 test_error.php的结果如下
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/test_error.php:3) in/Users/shuchao/Desktop/test_error.php on line 4原因分析
当我们在运行test_error.php的时候,因为redeclare了两个test()方法,所以php的语法解析器在parse-time的时候就出错了。 所以不能回调register_shutdown_function()中的方法,不能catch住这个fatal error。
NO.4
error_handler.php执行 include_all.php的结果如下
Fatal error: Cannot redeclare test() (previously declared in /Users/shuchao/Desktop/include_all.php:2) in /Users/shuchao/Desktop/include_all.php on line 3Yeah,it's worked!%结果分析
上面我们捕获了fatal_error.因为在运行include_all.php的时候,include_all.php本身语法并没有出错,也就是在parse-time的时候并没有出错,而是include的文件出错了,也就是在run-time的时候出错了,这个时候是能回调register_shutdown_function()中的函数的。
强烈建议:如果我们要使用register_shutdown_function进行错误捕捉,使用NO.4,最后一种方法,可以确保错误都能捕捉到。
更优美的写法·获取所有错误
set_error_handler()与register_shutdown_function()、error_get_last()的结合使用当异常抛出的时候,我们是想要去捕获他,并去做处理的。所以异常经常被当做程序的控制流程使用。
Error
Error是不可恢复的,是在开发过程中要去解决的。
使用Exception的例子
我想执行insert语句插入一条数据,可能插入失败(比如ID重复),注意是可能失败,所以这是一个可能的情况,也就是异常情况。我们就可以使用异常来处理这个问题
try { $row->insert(); $inserted = true; } catch (Exception $e) { echo "There was an error inserting the row - ".$e->getMessage(); $inserted = false; }echo "Some more stuff";如何catch一个未捕获的Exception
场景描述
假设程序中的有些地方直接throw了异常,没有进行catch。我们现在想要不管在程序的任何一个地方throw异常,即便在throw的地方没有被catch,我们也要能catch住,如何做到呢?
一个函数:set_exception_handler()
//设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。 在 exception_handler 调用后异常会中止。
set_exception_handler()使用示例
1、exception_handler.php getMessage();} 2、test_exception.php现在我们运行 test_exception.php,结果如下:
I am Exception //证明我们throw的Exception被捕获了
上一篇: ES6新特性开发微信小程序(7)
下一篇: php-fpm不工作,该如何处理
推荐阅读
-
php提示Call to undefined function curl_init() 错误的解决办法
-
IIS:IIS 8.5下设置404错误页_PHP教程
-
php出现curl 35号错误怎么办
-
php异常处理机制
-
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法,imagick_PHP教程
-
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
-
phpExcel导出大量数据出现内存溢出错误的解决方法_PHP教程
-
PHP语法异常,大神们都进来看看小弟我错哪了
-
PHP与js搭配的ajax中出现如下错误,不知道什么原因
-
PHP开发学堂:细看Pear的错误处理_PHP教程