PHP7 错误及异常机制
关键词
- 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 错误及异常机制的更多相关文章
- PHP7中的异常与错误处理
PHP 中的 Exception, Error, Throwable PHP 中将代码自身异常(一般是环境或者语法非法所致)称作错误 Error,将运行中出现的逻辑错误称为异常 Exception 错 ...
- PHP错误与异常
请一定要注意,没有特殊说明:本例 PHP Version < 7 说起PHP异常处理,大家首先会想到try-catch,那好,我们先看一段程序吧:有一个test.php文件,有一段简单的PHP程 ...
- PHP 注册错误和异常处理机制
注册错误和异常处理机制有三个PHP函数需要学习 1. register_shutdown_function('Bootstrap\Library\Frame::fatalError'); 2. set ...
- python的错误和异常
python错误和异常 错误 错误分为语法错误和逻辑错误 语法错误 >>> if File "<stdin>", line 1 if ^ Syntax ...
- Atitit 异常机制与异常处理的原理与概论
Atitit 异常机制与异常处理的原理与概论 1. 异常vs 返回码1 1.1. 返回码模式的处理 (瀑布if 跳到失败1 1.2. 终止模式 vs 恢复模式(asp2 1.3. 异常机制的设计原理 ...
- C++ 异常机制分析
C++异常机制概述 异常处理是C++的一项语言机制,用于在程序中处理异常事件.异常事件在C++中表示为异常对象.异常事件发生时,程序使用throw关键字抛出异常表达式,抛出点称为异常出现点,由操作系统 ...
- 【转载】C++异常机制的学习
参考了这篇文章:http://blog.chinaunix.net/uid-24517549-id-4079174.html 关于线程 进程和线程的概念相信各位看官早已耳熟能详.在这里,我只想带大家回 ...
- Java异常机制
Java异常分类 异常表明程序运行发生了意外,导致正常流程发生错误,例如数学上的除0,打开一个文件但此文件实际不存在,用户输入非法的参数等.在C语言中我们处理这类事件一般是将其与代码正常的流程放在一起 ...
- C 几种异常机制简单讲述
引言 这是关于C中如何使用异常机制的讨论.顺带讲一讲C中魔法函数的setjmp内部机制.通过它实现高级的异常try...catch. 允许我先扯一段面试题. 对于计算机面试题. 算法题等.觉得还是有意 ...
随机推荐
- git commit -m "XX"报错 pre -commit hook failed (add --no-verify to bypass)问题
在同步本地文件到线上仓库的时候 报错 pre -commit hook failed (add --no-verify to bypass) 当你在终端输入git commit -m "xx ...
- springMVC中的ModelAndView说明
ModelAndView 类别就如其名称所示,是代表了Spring Web MVC程式中呈现画面时所使用Model资料物件与View资料物件,由于Java程式中一次只能返回一个物件,所以ModelAn ...
- vscode 插件推荐 - 献给所有前端工程师(2018.4.29更新)
大家好,我是Moer.VScode现在已经越来越完善.性能远超Atom和webstorm,你有什么理由不用它?在这里,我会给你们推荐很多实用的插件,让你对 vscode 有更深刻的体会,渐渐地你就会知 ...
- pid稳态控制
https://blog.csdn.net/qq_25352981/article/details/81007075
- css中设置table中的td内容自动换行
word-break:break-all和word-wrap:break-word都是能使其容器如DIV的内容自动换行. 它们的区别就在于: 1,word-break:break-all 例如div宽 ...
- 微信小程序开发工具下载以及安装教程
微信公众平台上登录你的微信小程序账号 登录进入小程序开发-工具-下载,再根据你的系统选择相对应的版本地址进行下载. 以管理员身份运行下载,点击下一步,如图所示: 下一步,就会出现许可证协议 ...
- JAVA多线程程序ProgressBar2
JAVA多线程程序ProgressBar2 题目简介: 思路分析:与上一篇:JAVA多线程程序ProgressBar类似,本篇避免过于冗杂,所以在此没有给出. 实验代码: import java.aw ...
- MR1和MR2的工作原理
MapReduce1 分为6个步骤: 1.作业的提交 1).客户端向jobtracker请求一个新的作业ID(通过JobTracker的getNewJobId()方法获取,见第2步 2).计算作业的输 ...
- php register_shutdown_function响应error 配合error_get_last 捕获错误
转自: http://blog.csdn.net/a757291228/article/details/62231125 //一个函数,用来响应 register_shutdown_function ...
- Mac下的Pycharm教程
除非你是用记事本写代码,或者用vim写代码的大牛,那么推荐使用PyCharm编写Python代码. PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效 ...