当前位置: 首页 > news >正文

【PHP】PHP7的异常处理详解

前言

PHP7的改动中,影响比较大的,包括异常处理

概述

更多的异常是直接通过PHP直接处理的,和之前的PHP5不同的是更多的异常是通过Error exceptions来抛出。

作为一个普通的扩展,Error exceptions会持续冒出直到匹配到对应的catch块。如果没有进行匹配,就会触发被设置的set_exception_handler()来执行处理,如果没有默认的异常处理程序,则该异常将被转换为一个致命错误,并且将被像一个传统的错误被处理。

由于Error在错误层次结构不继承异常,像这样的代码catch (Exception $e) { ... }在PHP5中并不会捕获到对应的异常。我们可以用代码catch (Error $e) { ... }或者 set_exception_handler(),来对Error进行处理。

错误的层级结构

  • Throwable
    • Error 错误
      • ArithmeticError 算数错误
        • DivisionByZeroError 除数为0的错误
      • AssertionError 声明错误
      • ParseError 解析错误
      • TypeError 类型错误
    • Exception 异常
      • ….

PHP RFC

Throwable Interface


function add(int $left, int $right) {
    return $left + $right;
}

try {
    echo add('left', 'right');
} catch (Exception $e) {
    // Handle exception
} catch (Error $e) { // Clearly a different type of object
    // Log error and end gracefully
    var_dump($e);
}

这里,并没有出现服务器500的错误。原因在于,PHP7中的Error把它拦截住了,没有冒泡在服务器中。


object(TypeError)#1 (7) {
  ["message":protected]=>
  string(139) "Argument 1 passed to add() must be of the type integer, string given, called in /Applications/mamp/apache2/htdocs/curl/error.php on line 14"
  ["string":"Error":private]=>
  string(0) ""
  ["code":protected]=>
  int(0)
  ["file":protected]=>
  string(48) "/Applications/mamp/apache2/htdocs/curl/error.php"
  ["line":protected]=>
  int(9)
  ["trace":"Error":private]=>
  array(1) {
    [0]=>
    array(4) {
      ["file"]=>
      string(48) "/Applications/mamp/apache2/htdocs/curl/error.php"
      ["line"]=>
      int(14)
      ["function"]=>
      string(3) "add"
      ["args"]=>
      array(2) {
        [0]=>
        string(4) "left"
        [1]=>
        string(5) "right"
      }
    }
  }
  ["previous":"Error":private]=>
  NULL
}

这样我们就可以通过日志的方式记录他们。

Exceptions in the engine (for PHP 7)


function call_method($obj) {
    $obj->method();
}
try {
    call_method(null); // oops!
} catch (EngineException $e) {
    echo "Exception: {$e->getMessage()}\n";
}

//其实上面的例子我在运行过程中,并没有被EngineException捕获异常,经过测试,也是通过Error进行的错误的拦截

如果异常没有被捕获,PHP将继续担任目前它抛出同样的致命错误。

Reclassify E_STRICT notices

参考资料

  • http://php.net/manual/zh/language.errors.php7.php
  • http://www.php.net/manual/en/class.arithmeticerror.php
  • https://wiki.php.net/rfc/engine_exceptions_for_php7
  • https://wiki.php.net/rfc/throwable-interface
  • https://wiki.php.net/rfc/internal_constructor_behaviour
  • https://wiki.php.net/rfc/reclassify_e_strict

相关文章:

  • IOS开发知识(六)
  • linux基础网络设置
  • 深入浅出Node.js (6) - 理解Buffer
  • Javascript 正确用法 二
  • 广州Uber优步司机奖励政策(1月25日~1月31日)
  • 6.Java基础知识--IO
  • fiddler+jmeter联合使用
  • 解决包含已存在的php文件,但提示就是找不到的问题
  • 2016第4周六
  • JNI学习
  • Opencv中直线的表示方法
  • Grok debugger
  • ubuntu git 简单入门【转】
  • python selenium ---键盘事件
  • Getting started with Chrome Dev Editor
  • 【Leetcode】101. 对称二叉树
  • SegmentFault for Android 3.0 发布
  • angular2 简述
  • angular2开源库收集
  • conda常用的命令
  • GitUp, 你不可错过的秀外慧中的git工具
  • MobX
  • Mysql优化
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 编写符合Python风格的对象
  • 深度解析利用ES6进行Promise封装总结
  • 深入浅出Node.js
  • 使用common-codec进行md5加密
  • 通过git安装npm私有模块
  • 学习JavaScript数据结构与算法 — 树
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • Java数据解析之JSON
  • 带你开发类似Pokemon Go的AR游戏
  • 函数计算新功能-----支持C#函数
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (1)bark-ml
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (五)网络优化与超参数选择--九五小庞
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET Core中的去虚
  • .Net Web项目创建比较不错的参考文章
  • .NET 设计模式初探
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net专家(高海东的专栏)
  • /proc/vmstat 详解
  • @JsonFormat与@DateTimeFormat注解的使用
  • [].slice.call()将类数组转化为真正的数组
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [BUG] Authentication Error
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [c]扫雷