博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP 的 错误/异常 处理总结
阅读量:6674 次
发布时间:2019-06-25

本文共 2149 字,大约阅读时间需要 7 分钟。

错误

这里说的错误,可能是由 语法解析、运行时等各种原因产生的信息引起的

常见的错误类型

运行时错误

  • E_ERROR - 致命错误

    • 定义:致命的运行时错误
    • 后果:脚本终止不再继续运行
  • E_WARNING - 警告

    • 定义:运行时警告 (非致命错误)
    • 后果:给出提示信息,但是脚本不会终止运行
  • E_NOTICE - 通知

    • 定义:运行时通知
    • 结果:给出通知信息,但是脚本不会终止运行

其他类型错误

  • 编译时错误
    eg. E_PARSE E_COMPILE_ERROR E_COMPILE_WARNING ...
  • 用户产生的信息
    eg. E_USER_WARNING E_USER_ERROR E_USER_NOTICE
  • ... 等

具体如下图:

clipboard.png

参考:

错误处理

这里只针对运行时错误进行处理,其他(如:语法错误 Zend 引擎产生的错误 等)不在讨论范围内。

设置一般错误的处理函数

核心方法:

测试代码如下:

结果如下:

clipboard.png

这里我们看到,set_error_handler 只对 E_WARNING E_NOTICE 进行了捕获,并且当回调函数遇到

E_NOTICE 返回 true 的时候,我们看到底层对标准错误的输出,但是遇到 E_WARNING 返回 false,我们并没有看到底层对标准错误的输出。

总结,来自于官方手册:

  1. set_error_handler 第二个参数指定的错误类型都会绕过 PHP 标准错误处理程序
  2. 以下级别的错误不能由用户定义的函数来处理: E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING

备注:此方法可有针对性的对服务产生的消息进行收集,处理。比如:在框架初始化时,注册一个定制化的错误回调。

那致命错误有没有办法处理呢?接着看。

设置致命错误处理函数

我们知道致命错误会引起:脚本终止不再继续运行。

那么,我们就可以利用 方法做一些处理。
作用:注册一个会在php中止时执行的函数

测试代码如下:

结果如下:

clipboard.png

如前所述,发生致命错误,进程退出,但是中止之前执行了我们注册的回调函数。


异常

说明:我们这里指用户自定义的异常。

try-catch 捕获

测试代码如下:

getMessage() . PHP_EOL;} catch (\Exception $e) { echo 'Exception:' . $e->getMessage() . PHP_EOL;} finally { echo 'here is finally' . PHP_EOL;}

结果如下:

➜  answer git:(master) ✗ php exception.phpUserException:This is exceptionhere is finally

这是常见的捕获,不做过多说明,参见:

未捕获的异常

那么,如有抛出去的异常未被 catch,怎么办?

我们先看一下,未被 catch 会怎么样:

结果如下:

➜  answer git:(master) ✗ php throw.phpFatal error: Uncaught exception 'Exception' with message 'I am an exception' in /Users/javin/github/answer/throw.php:5Stack trace:#0 {main}  thrown in /Users/javin/github/answer/throw.php on line 5

会出现 致命错误,脚本中断,那么,我们当然可以用上边所说的 register_shutdown_function 来处理。

这样的话,就没有合其他致命错误区分了,那么,有没有专门处理未捕获的异常呢?
答案是有的,它就是:

测试代码如下:

getMessage());});throw new \Exception('I am an exception');echo 'I am here' . PHP_EOL;

结果如下:

➜  answer git:(master) ✗ php throw.phpThis is exception, msg:I am an exception

结论:set_exception_handler 可以对未捕获的异常进行处理,但是脚本仍然会因为致命错误而中断。


结尾

本文对 异常处理 做了简要的总结,其中涉及到三个核心方法 set_error_handler register_shutdown_function set_exception_handler,其详细说明,请参见 。

同时 PHP-7 中也有一些新的特性,比如:

参考:

最后,强烈建议开启编辑器的 语法检查 功能,不管是 IDE,还是 GUI 文本编辑器,还是 vim,这样可以避免很多不必要的错误。如果有使用版本控制,可以给对应的软件加上 语法检查 的钩子。

可以参考:


以上如有错误,请多多指正。如有遗漏,请多多补充。?

转载地址:http://mqgxo.baihongyu.com/

你可能感兴趣的文章
可显示Android设备选择列表,并进入指定Android设备Console的Shell脚本
查看>>
HDU 2831 (贪心)
查看>>
遍历js的obj中所有属性得key
查看>>
lua demo
查看>>
iOS开发-UITapGestureRecognizer手势
查看>>
在QTreeWidget中删除QTreeWidgetItem
查看>>
网页引导:jQuery插件实现的页面功能介绍引导页效果
查看>>
【CSS】使用CSS改变超链接样式
查看>>
HTC T328W刷机包 仿三星S5 UI美化 精简 S5落下
查看>>
spring AOP面向切面编程学习笔记
查看>>
Proftp设置虚拟用户(转)
查看>>
基于tiny4412的Linux内核移植(支持device tree)(二)
查看>>
iOS开发网络篇—NSURLConnection基本使用
查看>>
angularjs笔记(二)
查看>>
SQL Server数据库多种方式查找重复记录
查看>>
Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
查看>>
为什么我们要研究中断?【转】
查看>>
tcpdump wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容) 实例介绍...
查看>>
C#.net调用axis2webService
查看>>
NOIP2010乌龟棋[DP 多维状态]
查看>>