php7 错误处理,PHP7升级-异常错误处理
想了解更多我的文章,请关注我的博客http://liuxiaochun.cn
PHP最开始只有错误处理,直到PHP5才借鉴了其他语言,引入了异常处理,但是仍然无法处理致命错误,PHP7以后大部分致命错误和可捕获错误(E_ERROR 和 E_RECOVERABLE_ERROR)发生时会抛出异常,可以捕获,而不是停止脚本执行。但是对于某些情况,比如内存分配导致的问题等还会像原来一样直接停止脚本执行。遗憾的是某些情况官方并没有给出明确的规定。总之PHP的异常错误处理,虽然一直不是很清晰,是一个不断发展完善的过程,希望以后的版本会越来越好。
错误
定义
属于php脚本自身的问题,大部分情况是由错误的语法,服务器环境导致,使得编译器无法通过检查,甚至无法运行的情况。
错误常量说明
错误触发
触发分系统触发和用户触发,用户触发可以通过trigger_error产生一个用户级别的 error/warning/notice 信息,分别对应E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE三种错误
错误处理
mixed set_error_handler(callable $error_handler [, int $error_types = E_ALL | E_STRICT ])
注意如下:
error_types 里指定的错误类型都会绕过 PHP 标准错误处理程序, 除非回调函数返回了 false。
error_types 里指定的错误类型都会触发,跟error_reporting设置没关系,但是可以根据error_reporting做处理。
function _error_handler($errno, $errstr ,$errfile, $errline)
{
if (error_reporting() & $errno) {
//todo log;
}
}
set_error_handler('_error_handler');
注意@前缀语句发生错误时,error_reporting()返回0。@前缀春哥不推荐使用,效率低,而且@用正常错误和异常处理流程完全能搞定。
该函数不会导致脚本退出,会继续执行,所以有需要的话使用die()退出。
该函数目前有些鸡肋,只能处理E_WARNING,E_NOTICE和三种用户错误。
以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。
对PHP错误处理建议如下配置:
一定要让 PHP 报告错误;
在开发环境中要显示错误;
在生产环境中不能显示错误;
在开发和生产环境中都要记录错误。
生产环境:
;不显示错误
display_startup_errors = Off
display_errors = Off
;除了NOTICE外,报告所有错误
error_reporting = E_ALL & ~E_NOTICE
; 记录错误
log_errors = On
开发环境:
;显示错误
display_startup_errors = On
display_errors = On
;报告所有错误
error_reporting = -1
; 记录错误
log_errors = On
异常
定义
异常也是一中错误,只不过是一中优秀的处理方式,有如下特点:
异常可以自定义扩展
异常可以抛出和捕获,开发者能够根据具体的错误,进行相应的后续处理。
异常有调用堆栈信息,方便调试。
未被捕获的异常,将以fatal error 的形式中断脚本的执行并输出错误信息
层级
interface Throwable
|- Error implements Throwable
|- ArithmeticError extends Error
|- DivisionByZeroError extends ArithmeticError
|- AssertionError extends Error
|- ParseError extends Error
|- TypeError extends Error
|- ArgumentCountError extends TypeError
|- Exception implements Throwable
|- ClosedGeneratorException extends Exception
|- DOMException extends Exception
|- ErrorException extends Exception
|- IntlException extends Exception
|- LogicException extends Exception
|- BadFunctionCallException extends LogicException
|- BadMethodCallException extends BadFunctionCallException
|- DomainException extends LogicException
|- InvalidArgumentException extends LogicException
|- LengthException extends LogicException
|- OutOfRangeException extends LogicException
|- PharException extends Exception
|- ReflectionException extends Exception
|- RuntimeException extends Exception
|- OutOfBoundsException extends RuntimeException
|- OverflowException extends RuntimeException
|- PDOException extends RuntimeException
|- RangeException extends RuntimeException
|- UnderflowException extends RuntimeException
|- UnexpectedValueException extends RuntimeException
特殊说明:
PHP5中一些无法处理的Fatal Error在PHP7中可以作为Error异常处理。
ParseError require或者eval出现语法错误的时候被抛出.
TypeError 函数的传参与其对应的声明参数类型不匹配;函数返回值类型与声明的函数返回类型不匹配。将无效数量的参数传递给内置PHP函数。(strict mode only)
异常处理
try/catch
建议在框架的顶层增加try/catch来未能捕获的异常。
set_exception_handler
如果没有用try/catch捕获异常,则会调用该逻辑。
注意与set_error_handler不同的是,该函数调用后会终止脚本。
调用方式如下:
set_exception_handler('handle');//方式一
set_exception_handler(array('App','handle'));//方式二
PHP7升级的变化
set_exception_handler
// 修改前(PHP5代码)
set_exception_handler(function (Exception $e) {
echo 'Throw Exception: '.$e->getMessage();
});
// 修改后(同时兼容PHP5和PHP7代码)
set_exception_handler(function ($e) {
echo 'Throw Exception: '.$e->getMessage();
});
try/catch
// 修改前(PHP5代码)
try {
//Code
} catch (Exception $e) {
//TODO something
}
// 修改后(同时兼容PHP5和PHP7代码)
try {
//Code
} catch (Throwable $t) {
//TODO something
} catch (Exception $e) {
//TODO something
}
可能会出现的'BUG'
如下写法可能会导致一些问题, require之前最好判断一下is_file,具体详见https://bugs.php.net/bug.php?id=76636
t.php
error_reporting(E_ALL^E_NOTICE);
function _exception_handler($e)
{
var_dump($e);exit(1);
}
set_exception_handler('_exception_handler');
spl_autoload_register(function($className) {
$php = $className . ".php";
$ret = require_once $php;
return true;
});
spl_autoload_register(function($className) {
$php = "namespace\\" . $className . ".php";
$ret = require_once $php;
echo $e->getMessage();
return true;
});
new mytest();
mytest.php
class mytest {
fdsaf;//parse error
}
小结
总之PHP异常是错误的一种,在PHP7中错误可以分为可处理错误(set_error_handler),异常(Exception/Error),不可处理错误。
php7 错误处理,PHP7升级-异常错误处理相关推荐
- Optional orElseThrow 错误: 未报告的异常错误X; 必须对其进行捕获或声明以便抛出...
情况说明 以下代码: Optional.ofNullable(u).map(u->{.... }).orElseThrow(()->{throw new CommonException(& ...
- c-free5.0运行程序错误_web前端之异常/错误监控
为什么要异常/错误监控 我们都知道有程序难免就会有异常/错误,当我们代码越来越多的时候异常/错误出现的几率也就会多,虽然我们会有测试,但是测试用例并不能覆盖所有可能,所以程序在生产上运行的时候进行异常 ...
- 电视PPTV服务器响应异常,PPTV出现异常错误怎么办?PPTV异常错误解决方法
PPTV是一款功能强大的网络电视软件,因此很多用户常常会在这边看电视剧.电影等,但是有时候在打开PPTV想要看点视频的时候却出现异常错误,很多人都蒙了,那么当你遇到PPTV出现异常错误了该怎么办呢?不 ...
- java异常错误的是,java 异常 错误处理
场景:thinking in java 学习笔记 12 通过错误处理异常 thinking in java 学习笔记 12 通过异常处理错误 第十二章 通过异常处理错误 在以前平时的编程中没有真正意思 ...
- php7.1 改动,PHP7错误处理机制修改
一.现在有两个异常类:Exception and Error. PHP7现在有两个异常类,Exception and Error.这两个类都实现了一个新的接口:Throwable.在您的异常处理代码中 ...
- PHP 异常错误处理
目录 错误与异常 异常类 错误类(PHP >= 7) 错误 错误报告级别 错误报告设置 全局异常处理程序 全局错误处理函数 无法捕获的错误类型 范例代码 开发/生产环境处理错误和异常 开发环境 ...
- python open ascii codec cant_解决Python2.7的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误...
今天准备将某SQLite数据库的内容导出到文本文档(*.txt)中,设计的Python程序如下: # -*- coding: UTF-8 -*- import sqlite3 def gsel(cur ...
- IDEA编译报错:java: 未报告的异常错误X; 必须对其进行捕获或声明以便抛出
IDEA编译Flink源码时报错: java: 未报告的异常错误X; 必须对其进行捕获或声明以便抛出 原因是环境变量配置的是JDK8,Flink部分代码是基于JDK11编写的,将JDK升级为JDK11 ...
- 总结:整理 oracle异常错误处理
5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4 用户定义的异常处理 5.2 异常错误传播 5.2.1 在执行部分引发 ...
最新文章
- 这些 Shell 分析服务器日志命令集锦,收藏好
- 【Luogu】P3356火星探险问题(费用流)
- openssh实现key验证免密码登录
- 【Python】卸载 PyCharm!这才是 Python 小白的最理想的 IDE
- 352. 将数据流变为多个不相交区间
- 【软件开发底层知识修炼】八 Binutils辅助工具之- objdump工具 与 size,strings工具
- 2021年 CentOS 快速安装 最新版Nginx
- PostgreSQL学习总结(1)—— PostgreSQL 入门简介与安装
- 天翼网关获取超级密码
- matlab 拉普拉斯求解,matlab解拉普拉斯方程.ppt
- 高精度WGS84与GCJ-02坐标转换
- MICCAI 2022 | ASA:用于预训练脑核磁分割的注意力对称自动编码器
- origin柱状图同时有两组数和两组数差值_教程 | Origin用矩阵绘制多层曲面映射图...
- 5G技术详解系列-PDU会话签约数据(6)
- 路由器设置多WAN口要点技巧
- python程序员电脑推荐_2019程序员笔记本推荐?
- 心脏滴血漏洞简单攻击
- 错误“a label can only be part of a statement and a declaration is not a statement”解决方法
- 火车票退票费计算,2013年起,火车票退票费比例下调:票面乘车站开车时间前48小时以上的按票价5%计退票费。同时,车票退票费的计算方法不再四舍五入到元为单位,而以5角为单位:尾数小于0.25元的舍去
- springboot整合freemarker案例
热门文章
- C# 将PDF文件转换为word格式
- Javascript 立即执行函数
- Oracle根底数据标准存储名目浅析(三)——日期标准(三)
- 趣学 C 语言(五)—— 内存管理
- 颜色(color)、字体(Fonts)管理(颜色的 hex 表示)
- 标准模板库(STL)之 queue 列传
- C++基础::typeid、type_info
- 江苏高考成绩什么时候可以查询2021,2021年江苏高考成绩什么时候公布出来,几月几号几点钟可以查询...
- python入门教程 非常详细-Python编程入门教程:从入门到高级,非常详细
- 手机上有没有学python的软件-三款可以在安卓手机上运行Python代码的软件