想了解更多我的文章,请关注我的博客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升级-异常错误处理相关推荐

  1. Optional orElseThrow 错误: 未报告的异常错误X; 必须对其进行捕获或声明以便抛出...

    情况说明 以下代码: Optional.ofNullable(u).map(u->{.... }).orElseThrow(()->{throw new CommonException(& ...

  2. c-free5.0运行程序错误_web前端之异常/错误监控

    为什么要异常/错误监控 我们都知道有程序难免就会有异常/错误,当我们代码越来越多的时候异常/错误出现的几率也就会多,虽然我们会有测试,但是测试用例并不能覆盖所有可能,所以程序在生产上运行的时候进行异常 ...

  3. 电视PPTV服务器响应异常,PPTV出现异常错误怎么办?PPTV异常错误解决方法

    PPTV是一款功能强大的网络电视软件,因此很多用户常常会在这边看电视剧.电影等,但是有时候在打开PPTV想要看点视频的时候却出现异常错误,很多人都蒙了,那么当你遇到PPTV出现异常错误了该怎么办呢?不 ...

  4. java异常错误的是,java 异常 错误处理

    场景:thinking in java 学习笔记 12 通过错误处理异常 thinking in java 学习笔记 12 通过异常处理错误 第十二章 通过异常处理错误 在以前平时的编程中没有真正意思 ...

  5. php7.1 改动,PHP7错误处理机制修改

    一.现在有两个异常类:Exception and Error. PHP7现在有两个异常类,Exception and Error.这两个类都实现了一个新的接口:Throwable.在您的异常处理代码中 ...

  6. PHP 异常错误处理

    目录 错误与异常 异常类 错误类(PHP >= 7) 错误 错误报告级别 错误报告设置 全局异常处理程序 全局错误处理函数 无法捕获的错误类型 范例代码 开发/生产环境处理错误和异常 开发环境 ...

  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 ...

  8. IDEA编译报错:java: 未报告的异常错误X; 必须对其进行捕获或声明以便抛出

    IDEA编译Flink源码时报错: java: 未报告的异常错误X; 必须对其进行捕获或声明以便抛出 原因是环境变量配置的是JDK8,Flink部分代码是基于JDK11编写的,将JDK升级为JDK11 ...

  9. 总结:整理 oracle异常错误处理

    5.1 异常处理概念 5.1.1 预定义的异常处理 5.1.2 非预定义的异常处理 5.1.3 用户自定义的异常处理 5.1.4  用户定义的异常处理 5.2 异常错误传播 5.2.1 在执行部分引发 ...

最新文章

  1. 这些 Shell 分析服务器日志命令集锦,收藏好
  2. 【Luogu】P3356火星探险问题(费用流)
  3. openssh实现key验证免密码登录
  4. 【Python】卸载 PyCharm!这才是 Python 小白的最理想的 IDE
  5. 352. 将数据流变为多个不相交区间
  6. 【软件开发底层知识修炼】八 Binutils辅助工具之- objdump工具 与 size,strings工具
  7. 2021年 CentOS 快速安装 最新版Nginx
  8. PostgreSQL学习总结(1)—— PostgreSQL 入门简介与安装
  9. 天翼网关获取超级密码
  10. matlab 拉普拉斯求解,matlab解拉普拉斯方程.ppt
  11. 高精度WGS84与GCJ-02坐标转换
  12. MICCAI 2022 | ASA:用于预训练脑核磁分割的注意力对称自动编码器
  13. origin柱状图同时有两组数和两组数差值_教程 | Origin用矩阵绘制多层曲面映射图...
  14. 5G技术详解系列-PDU会话签约数据(6)
  15. 路由器设置多WAN口要点技巧
  16. python程序员电脑推荐_2019程序员笔记本推荐?
  17. 心脏滴血漏洞简单攻击
  18. 错误“a label can only be part of a statement and a declaration is not a statement”解决方法
  19. 火车票退票费计算,2013年起,火车票退票费比例下调:票面乘车站开车时间前48小时以上的按票价5%计退票费。同时,车票退票费的计算方法不再四舍五入到元为单位,而以5角为单位:尾数小于0.25元的舍去
  20. springboot整合freemarker案例

热门文章

  1. C# 将PDF文件转换为word格式
  2. Javascript 立即执行函数
  3. Oracle根底数据标准存储名目浅析(三)——日期标准(三)
  4. 趣学 C 语言(五)—— 内存管理
  5. 颜色(color)、字体(Fonts)管理(颜色的 hex 表示)
  6. 标准模板库(STL)之 queue 列传
  7. C++基础::typeid、type_info
  8. 江苏高考成绩什么时候可以查询2021,2021年江苏高考成绩什么时候公布出来,几月几号几点钟可以查询...
  9. python入门教程 非常详细-Python编程入门教程:从入门到高级,非常详细
  10. 手机上有没有学python的软件-三款可以在安卓手机上运行Python代码的软件