关键词

  • 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 的异常处理逻辑代码

<?php
/**
* test.php
*/
function getBackTraceStr() {
ob_start();
debug_print_backtrace();
$trace = ob_get_contents();
ob_end_clean(); return $trace;
} function _exceptionHandler($e) {
var_dump($e);
} function check_for_fatal()
{
var_dump("end");
$error = error_get_last();
var_dump($error);
} function _errorHandler($errNo, $errStr, $errFile, $errLine) {
var_dump($errNo);
var_dump($errStr);
var_dump($errFile);
var_dump($errLine);
$trace = getBackTraceStr();
var_dump($trace);
throw new ErrorException($errStr, 0, $errNo, $errFile, $errLine);
} set_error_handler("_errorHandler");
set_exception_handler("_exceptionHandler");
register_shutdown_function("check_for_fatal");
error_reporting(E_USER_ERROR);
error_reporting(E_ALL);
ini_set('display_errors', "on");
ini_set('log_errors', "on"); var_dump(error_reporting()); $a = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED; $b = 1 % 0; try {
$a->nonexist();
$b = 1 / 0;
trigger_error("fuck", E_USER_ERROR);
throw new Exception("abc");
} catch(Throwable $e) {
var_dump($e);
}
trigger_error("fuck", E_USER_ERROR);
require("abc.json");
throw new Exception("abc");
noexist(3, 54);
try {
require("abc.json");
} catch (Error $e) {
var_dump("what");
}
define("hello", 1);
define("hello", 1); 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. C++入门经典-例8.10-实现抽象类中的成员函数

    1:抽象类通常作为其他类的父类,如果从抽象类派生的子类是抽象类,则子类必须实现父类中的所有纯虚函数.代码如下: // 8.10.cpp : 定义控制台应用程序的入口点. // #include &qu ...

  2. CSS标签详解

    CSS3标签 Css3概述 从2010年开始,HTML5与CSS3就一直是互联网技术中最受关注的两个话题.从前端技术的角度可以把互联网的发展分为三个阶段:第一阶段是web1.0以内容为主的网络,前端主 ...

  3. H264之基础篇

    1. H264 基础概念 在 H.264/AVC 视频编码标准中,整个系统框架划分为如下两个层面: 视频编码层(VCL):VCL 数据即被压缩编码后的视频数据序列,负责有效表示视频数据的内容: 网络抽 ...

  4. SRS之RTMP handshake

    1. SrsRtmpServer::handshake 位于 srs_rtmp_stack.cpp. int SrsRtmpServer::handshake() { int ret = ERROR_ ...

  5. 【免费电子书】这可能是全网最齐的程序员编程电子书PDF合集了!

    [toc] 最近博主

  6. RF框架自定义测试库开发

    静态库 方法(methods)直接映射为关键字名称.关键字接受和方法相同的参数, 通过抛异常来 报告错误, 通过往标准输出里写入来写 log, 同时可以通过return 来返回结果. 创建步骤: ▲ ...

  7. Eclipse IDE for C/C++ Developers和MinGW安装配置C/C++开发学习环境详解

    Eclipse IDE for C/C++ Developers和MinGW安装配置C/C++开发学习环境详解 操作系统:Windows 7 JDK版本:1.6.0_33 Eclipse版本:Juno ...

  8. invalid new-expression of abstract class type 'CurveFittingEdge'

    目录 一 报错原因 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 报错原因 今天遇到了一个之前从未遇到的报错: error: invalid new-expression of abstr ...

  9. UnitTest之Xunit

    Unit Test 1.建立单元测试 新建一个类库项目,在Nuget中搜索xunit,选择 xUnit.net 和 xunit.runner.visualstudio 插件包安装. xunit.run ...

  10. DirectX* 11 多线程渲染的性能、方法和实践

    对于在 CPU 上运行的 PC 游戏,渲染通常是主要的性能瓶颈:多线程渲染是一种消除瓶颈的有效方法.本文研究了 DirectX* 11 多线程渲染的性能可扩展性,讨论了多线程渲染的两种基本方法,并介绍 ...