关键词

  • error 不能在编译期发现的运行期错误,比如试图用 echo 输出一个未赋值的变量,这类问题往往导致程序或逻辑无法继续下去而需要中断;
  • exception 程序执行过程中出现意料之外的情况,逻辑上往往是行得通的,但不符合应用场景,比如接收到一个长度超出预定格式的用户命名,因此,异常主要靠编码人员做预先做判断后抛出,捕获异常后改变程序流程来处理这些情况,不必中断程序。
  • error_reporting 设置错误的报告级别,返回给客户端
  • display_errors 设置是否将错误展示给客户端
  • log_errors 设置是否记录错误日志
  • error_log 设置错误日志记录路径
  • try-catch
  • trigger_error 用户主动触发的错误
  • set_error_handler 自定义 error 处理逻辑,可以捕获绝大部分的 error,如果自定义函数 return false,则处理逻辑结束后,程序是否结束取决于 error 的情况(即是否继续执行取决于其他设置),如果不 return false,则处理逻辑结束后,程序正常运行 error 之后的代码。但是以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。
  • set_exception_handler 自定义 exception 的处理逻辑,当发现某个 exception 没有被 catch 的时候,就会调用这个函数,不管这个自定义的异常处理逻辑运行状况如何,在异常处理完之后,程序一定会被中断
  • register_shutdown_function 自定义的程序结束逻辑处理,不管是否正常结束,是否进入了 set_error_handler 和 set_exception_handler 都将在程序结束前执行这段自定义逻辑,未捕获的 error(一般未捕获的 error 都会导致程序中断),可以在这里进行处理

概述

php7 相比 5.6,对于异常和错误做了一些改进,原来的一些 fatal error 在 7.0 以后版本都被作为 error 抛出,可以使用 try-catch 进行捕获处理。

感觉 php 中对于 error 和 exception 的定义比较模糊

一段测试 php7 的异常处理逻辑代码

  1. <?php
  2. /**
  3. * test.php
  4. */
  5. function getBackTraceStr() {
  6. ob_start();
  7. debug_print_backtrace();
  8. $trace = ob_get_contents();
  9. ob_end_clean();
  10. return $trace;
  11. }
  12. function _exceptionHandler($e) {
  13. var_dump($e);
  14. }
  15. function check_for_fatal()
  16. {
  17. var_dump("end");
  18. $error = error_get_last();
  19. var_dump($error);
  20. }
  21. function _errorHandler($errNo, $errStr, $errFile, $errLine) {
  22. var_dump($errNo);
  23. var_dump($errStr);
  24. var_dump($errFile);
  25. var_dump($errLine);
  26. $trace = getBackTraceStr();
  27. var_dump($trace);
  28. throw new ErrorException($errStr, 0, $errNo, $errFile, $errLine);
  29. }
  30. set_error_handler("_errorHandler");
  31. set_exception_handler("_exceptionHandler");
  32. register_shutdown_function("check_for_fatal");
  33. error_reporting(E_USER_ERROR);
  34. error_reporting(E_ALL);
  35. ini_set('display_errors', "on");
  36. ini_set('log_errors', "on");
  37. var_dump(error_reporting());
  38. $a = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED;
  39. $b = 1 % 0;
  40. try {
  41. $a->nonexist();
  42. $b = 1 / 0;
  43. trigger_error("fuck", E_USER_ERROR);
  44. throw new Exception("abc");
  45. } catch(Throwable $e) {
  46. var_dump($e);
  47. }
  48. trigger_error("fuck", E_USER_ERROR);
  49. require("abc.json");
  50. throw new Exception("abc");
  51. noexist(3, 54);
  52. try {
  53. require("abc.json");
  54. } catch (Error $e) {
  55. var_dump("what");
  56. }
  57. define("hello", 1);
  58. define("hello", 1);
  59. var_dump("a");

PHP7 错误及异常机制的更多相关文章

  1. PHP7中的异常与错误处理

    PHP 中的 Exception, Error, Throwable PHP 中将代码自身异常(一般是环境或者语法非法所致)称作错误 Error,将运行中出现的逻辑错误称为异常 Exception 错 ...

  2. PHP错误与异常

    请一定要注意,没有特殊说明:本例 PHP Version < 7 说起PHP异常处理,大家首先会想到try-catch,那好,我们先看一段程序吧:有一个test.php文件,有一段简单的PHP程 ...

  3. PHP 注册错误和异常处理机制

    注册错误和异常处理机制有三个PHP函数需要学习 1. register_shutdown_function('Bootstrap\Library\Frame::fatalError'); 2. set ...

  4. python的错误和异常

    python错误和异常 错误 错误分为语法错误和逻辑错误 语法错误 >>> if File "<stdin>", line 1 if ^ Syntax ...

  5. Atitit 异常机制与异常处理的原理与概论

    Atitit 异常机制与异常处理的原理与概论 1. 异常vs 返回码1 1.1. 返回码模式的处理 (瀑布if 跳到失败1 1.2. 终止模式  vs 恢复模式(asp2 1.3. 异常机制的设计原理 ...

  6. C++ 异常机制分析

    C++异常机制概述 异常处理是C++的一项语言机制,用于在程序中处理异常事件.异常事件在C++中表示为异常对象.异常事件发生时,程序使用throw关键字抛出异常表达式,抛出点称为异常出现点,由操作系统 ...

  7. 【转载】C++异常机制的学习

    参考了这篇文章:http://blog.chinaunix.net/uid-24517549-id-4079174.html 关于线程 进程和线程的概念相信各位看官早已耳熟能详.在这里,我只想带大家回 ...

  8. Java异常机制

    Java异常分类 异常表明程序运行发生了意外,导致正常流程发生错误,例如数学上的除0,打开一个文件但此文件实际不存在,用户输入非法的参数等.在C语言中我们处理这类事件一般是将其与代码正常的流程放在一起 ...

  9. C 几种异常机制简单讲述

    引言 这是关于C中如何使用异常机制的讨论.顺带讲一讲C中魔法函数的setjmp内部机制.通过它实现高级的异常try...catch. 允许我先扯一段面试题. 对于计算机面试题. 算法题等.觉得还是有意 ...

随机推荐

  1. zookeeper系列(八)zookeeper客户端的底层详解

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败.出处:http://www.cnblogs.com/leesf456/p/6098255.html 尊重原创,共同学习进步:  一.前言 ...

  2. 尚学堂requireJs课程---1、作用域回顾

    尚学堂requireJs课程---1.作用域回顾 一.总结 一句话总结: 尚学堂的课程的资料他的官网上面是有的 1.js作用域? ~ js中是函数作用域:局部变量的话要写var关键词 ~ 闭包可以解决 ...

  3. 9.关联规则那不行fizi麸子

    1.关联规则概述 2.关联规则算法罗兵烙饼选择 3.关联规则的算法

  4. ROC和AUC————摘在网络

    ROC曲线 对于0,1两类分类问题,一些分类器得到的结果往往不是0,1这样的标签,如神经网络,得到诸如0.5,0,8这样的分类结果.这时,我们人为取一个阈值,比如0.4,那么小于0.4的为0类,大于等 ...

  5. 解剖PTP协议

    一. PTP是什么? 英文为Precise Time Protocol,翻译过来就是精确时间协议 二. 为何会出现PTP? 大家想必是知道NTP的存在,然而NTP的精度很低,只能达到毫秒级别的精度,那 ...

  6. GitHub-Microsoft:DotNet3

    ylbtech-GitHub-Microsoft:DotNet3 1.返回顶部 · mbmlbook Sample code for the Model-Based Machine Learning ...

  7. vue 登录页面填坑

    上边的导航头,会显示在登陆页面上,暂时的解决办法实: <template> <div style="position: fixed; top:0px; left:0px;h ...

  8. Zabbix - 配置服务器对第三方服务的监控

    需求: 需要配置zabbix监控,使得zabbix服务器可以监控到另一台服务器上运行的第三方服务的状态,当状态异常时发送告警邮件. 限制:被监控的服务器不允许安装任意客户端,且该台服务器不能联通外网 ...

  9. 代码实现:键盘录入一个int类型的整数,对其求二进制表现形式

    package com.loaderman.test; import java.math.BigDecimal; import java.math.BigInteger; import java.ut ...

  10. ESP32开发之Windows开发环境

    电脑出了问题linux系统下的环境不知道怎么就挂了,在一次搭建,总是出错,没办法,只能在win10下一试. 1 下载交叉编译工具,最新版 找到并下载最新的工具链: https://dl.espress ...