资讯专栏INFORMATION COLUMN

PHP 的 错误/异常 处理总结

Faremax / 2670人阅读

摘要:这样的话,就没有合其他致命错误区分了,那么,有没有专门处理未捕获的异常呢答案是有的,它就是测试代码如下让错误信息在标准输出可见回调函数签名结果如下结论可以对未捕获的异常进行处理,但是脚本仍然会因为致命错误而中断。

错误

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

常见的错误类型 运行时错误

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

... 等

具体如下图:

参考:PHP-错误处理-预定义常量

错误处理

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

设置一般错误的处理函数

核心方法:set_error_handler

测试代码如下:


结果如下:

这里我们看到,set_error_handler 只对 E_WARNING E_NOTICE 进行了捕获,并且当回调函数遇到
E_NOTICE 返回 true 的时候,我们看到底层对标准错误的输出,但是遇到 E_WARNING 返回 false,我们并没有看到底层对标准错误的输出。

总结,来自于官方手册:

set_error_handler 第二个参数指定的错误类型都会绕过 PHP 标准错误处理程序

以下级别的错误不能由用户定义的函数来处理: E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING

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

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

设置致命错误处理函数

我们知道致命错误会引起:脚本终止不再继续运行。
那么,我们就可以利用 register_shutdown_function 方法做一些处理。
作用:注册一个会在php中止时执行的函数

测试代码如下:


结果如下:

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


异常

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

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.php
UserException:This is exception
here is finally

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

未捕获的异常

那么,如有抛出去的异常未被 catch,怎么办?
我们先看一下,未被 catch 会怎么样:


结果如下:

➜  answer git:(master) ✗ php throw.php

Fatal error: Uncaught exception "Exception" with message "I am an exception" in /Users/javin/github/answer/throw.php:5
Stack trace:
#0 {main}
  thrown in /Users/javin/github/answer/throw.php on line 5

会出现 致命错误,脚本中断,那么,我们当然可以用上边所说的 register_shutdown_function 来处理。
这样的话,就没有合其他致命错误区分了,那么,有没有专门处理未捕获的异常呢?
答案是有的,它就是:set_exception_handler

测试代码如下:

getMessage());
});

throw new Exception("I am an exception");
echo "I am here" . PHP_EOL;

结果如下:

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

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


结尾

本文对 异常处理 做了简要的总结,其中涉及到三个核心方法 set_error_handler register_shutdown_function set_exception_handler,其详细说明,请参见 官方手册 。
同时 PHP-7 中也有一些新的特性,比如:Error 类

参考:PHP 7 错误处理

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

可以参考:

我的 vim-配置

自动化检测PHP语法和编程规范(Git pre-commit)


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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26135.html

相关文章

  • php之道》读后总结 php学习纲要

    摘要:日期和时间使用类完成读取设置比较和计算日期与时间。单元测试单元测试是从编写开始,贯穿于整个开发周期的一种用于保证函数类和方法的行为与预期一致的编程方法。是应用的单元测试框架的业界标准,其他几个可选框架是行为驱动开发行为驱动开发有两种方式和。 《php之道》阅读地址:http://wulijun.github.io/php-the-right-way/#code_style_guide ...

    gitmilk 评论0 收藏0
  • PHP框架中日志系统

    摘要:一的几个函数异常捕获自定义处理函数注册错误捕获自定义处理函数注册程序执行时异常终止错误捕获处理函数注册这三个函数在错误处理控制中给开发者提供了很大的自主空间,在日志系统中记录日志信息有他们的功劳。下面要说的类库是借鉴了日志系统的设计。 引言 接触过php框架的朋友们可能都知道,日志在项目中的重要作用了,他可以帮助我们定位错误的位置,让程序更友好(处理得当的话不会直接抛出一大堆只有程...

    ningwang 评论0 收藏0
  • Python常见异常问题总结

      小编写这篇文章的一个主要目的,就是来给大家去做一个解答,解答的内容主要是Python常见的一些bug和异常问题,那么,遇到这些问题的时候,我们需要找到好办法去进行处理。那么,小编这边就给大家做了一个总结,总结常见的异常问题,大家好好阅读哦。  异常处理介绍  在实际的开发中,我们经常遇到一些报错的例子,在pycharm的显示页面下,当我们看到一串串的红色的英文字母的时候,就是出现异常,这个时候...

    89542767 评论0 收藏0

发表评论

0条评论

Faremax

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<