php的错误异常机制

当我们没有自定义错误异常处理函数,php会按照默认的方式处理和显示错误异常。

自定义默认的错误异常处理函数

//注册捕获错误的处理函数
set_error_handler([__CLASS__, 'appError']);
//注册捕获错误的处理函数
set_exception_handler([__CLASS__, 'appException']);
//程序结束后执行的函数,可以获取到进程最后一个错误,方便上面两种方式没有触发的情况下处理错误
register_shutdown_function([__CLASS__, 'appShutdown']);

不同的php版本对错误和异常的捕获有不同,php7以上版本,几乎所有的错误和异常都可以被set_exception_handler注册的函数捕获。

错误异常处理函数

public static function appException($e)
{
​if (!$e instanceof \Exception) {$e = new ThrowableError($e);}//把错误信息写入到log文件self::getExceptionHandler()->report($e);
​if (PHP_SAPI == 'cli') {self::getExceptionHandler()->renderForConsole(new ConsoleOutput, $e);} else {//把错误信息写入到tmpl模板,发送给客户端self::getExceptionHandler()->render($e)->send();}
}

一定要接受一个参数$e,这是一个异常对象。它保存了错误的种类,行号,等等信息。我们处理错误异常就是根据这个对象来处理的。而且我们可以判断$e是属于哪个异常类,从而进行不同的处理。

tp5.1使用think\exception\handle类来处理异常的显示,比如report,render等等处理,我们就可以修改这个handle类的方法,来自定义显示错误。

php内置异常类的了解

实际上php内置了很多异常类, Error 类 和 Exception 类 都继承自 Throwable 接口,而这连个类下面又有很多子类,不同的php版本子类可能不一样,比如下面

ErrorParseErrorTypeErrorArgumentCountError
ExceptionRuntimeExceptionPDOException

php7以上ParseError继承Exception,所有说大部分异常都继承Exception

分析一下Exception类

Exception {
/* 属性 */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* 方法 */

这个类的介绍可以查看php的手册,已经内置了很多方法。php为什么会内置这么多异常呢?主要是因为不同的错误和异常,php都会产生对应的异常类抛出。所以我们的异常处理函数要保证所有的异常都能处理。

自定义异常类,手动抛出异常类

有时候我们需要根据自己的需求,可以创建自定义异常类,只要继承php内置的异常类即可。比如tp5.1框架的HttpException异常

class HttpException extends \RuntimeException
{private $statusCode;private $headers;
​public function __construct($statusCode, $message = null, \Exception $previous = null, array $headers = [], $code = 0){$this->statusCode = $statusCode;$this->headers    = $headers;parent::__construct($message, $code, $previous);}
}

只是多加了两个属性$statuCode,$header。我们手动抛出这个异常的时候,就要多传这些数据进去,然后手动抛出

throw new HttpException(404, 'controller not exists:'); //手动抛出异常

有了这两个信息,我们再处理异常的时候就可以先判断获取的异常是属于哪个异常类,然后再根据不同的异常显示不同的信息。

php异常处理原理

在一个进程中,异常的抛出可以是php发现错误和异常自动抛出对应的异常对象,也可以我们手动抛出异常实例。抛出后代码将不再往下执行,而是执行异常处理函数,执行完捕获异常的函数,进程就会终止。

异常抛出后,最会执行最先捕获异常的那个函数。比如代码中写了try..catch{},如果在catch已经捕获了异常,就不会让set_exception_handler注册的函数捕获了。

register_shutdown_function注册的函数在进程结束的时候都会执行,关于这个函数可以查找php手册,我们只是恰好可以在里面处理一些非常特殊的问题(有些问题php可能不会抛出异常)。在这个函数中可以通过error_get_last()得到进程失败的问题。

public static function appShutdown(){if (!is_null($error = error_get_last()) && self::isFatal($error['type'])) {// 将错误信息托管至think\ErrorException$exception = new ErrorException($error['type'], $error['message'], $error['file'], $error['line']);self::appException($exception);}// 写入日志Container::get('log')->save();}

php的错误异常处理相关推荐

  1. Go语言的错误异常处理机制及其应用

    一.背景 在日常编写golang程序或阅读别人的golang代码时,我们总会看到如下的一堆代码块: xx, err = func(xx) if err != nil {//do sth. to tac ...

  2. Laravel 5.5 的错误异常处理机制以及应用实例

    一.前言 我们在开发项目中,难免会因为逻辑上的失误而报错,这些报错的展现形式也就是框架封装好的异常处理机制.在项目上线之前,我们还可以根据框架提供的报错信息来锁定错误代码的位置.但是项目上线之后我们是 ...

  3. 错误异常处理 小数格式化,取证与四舍五入 random处理 日期与时间常用操作

    异常处理 文章目录 异常处理 语法错误 语义错误 逻辑错误 异常处理 finally try eccept finally raise 测试 unittest 测试组织代码 常用断言方法 是否正确 存 ...

  4. PHP7语法知识(三):时间与日期、表单、类与对象、正则表达式、错误异常处理、图像处理...

    时间与日期 一.设置时区 1.在配置文件中设置: 2.通过data_default_timezone_set函数在文件中设置: 二.获取当前时间 三.常用时间处理方法 1.格式化时间显示: 2.计算时 ...

  5. 浅谈Go 错误异常处理方式和并发陷进

    任何一门开发语言中,错误和异常处理都是不可回避的问题,Go 中主要通过 error 和 panic 分别表示错误和异常,并提供了较为简洁的错误异常处理机制.作为一门并发性能优越的语言,Go 虽然降低了 ...

  6. C错误异常处理,异常处理

    预处理器标识#error的目的是什么啊? 指令 用途# 空指令,无任何效果#include 包含一个源代码文件#define 定义宏#undef 取消已定义的宏#if 如果给定条件为真,则编译下面代码 ...

  7. js 错误/异常处理

    为什么80%的码农都做不了架构师?>>>    /*** 自定义错误处理*/ onerror = handleError; function handleError(desc,pag ...

  8. php 错误 异常,PHP错误异常处理

    错误处理是捕获程序引发的错误,然后采取适当的措施的过程. 如果能正确处理错误,那么可以处理许多不可预见的后果. 在PHP中处理一个错误是非常简单的. 使用die()函数 在编写PHP程序时,应该在继续 ...

  9. libjpeg:实现jpeg内存压缩暨error_exit错误异常处理和个性化参数设置

    libjpeg-turbo是与libjpeg接口兼容的一个jpeg编/解码库,其主要的特点就是利用SIMD指令(如X86架构的MMX/SSE/SSE2,ARM架构的NEON)来加速jpeg图像的编/解 ...

最新文章

  1. 【模型蒸馏】从入门到放弃:深度学习中的模型蒸馏技术
  2. [c++] vector<vector<int>>排序
  3. 学完了python能做什么-学完Python能做什么
  4. CentOS7安装mysql数据库
  5. 《编译原理》第二章知识点
  6. Mac使用crontab来实现定时任务
  7. 在Activity启动过程中如何任务栈的栈顶是否是将要启动的Activity的实例
  8. Java-IO-对接流
  9. python pca双标图的含义_PCA双标图 - 箭长度
  10. JavaScript 移动和触摸框架
  11. [HeadFirst-HTMLCSS入门][第十章div,span]
  12. 快速掌握消息队列MQ最内核,图文并茂详解
  13. 通过InstallShield官网申请注册码
  14. 无线院2018下半年技术教练认证-专业能力测评初试
  15. tp5欢迎页 (获取系统信息)
  16. Activiti表结构
  17. Design Compiler工具学习笔记(6)
  18. B 站,真香 ! ! !
  19. 全选反选的逻辑和代码
  20. Java 实现分段截取视频 生成gif图 使用ffmpeg操作

热门文章

  1. python中的const_Python实现Const详解
  2. Ancient Wisdom
  3. scrapy框架 爬取重庆工程学院
  4. Redis入门完整教程:寻找热点key
  5. 双象空间前方交会代码_空间前方交会公式推导.PPT
  6. 机场生产运行数据统计指标-第三篇-客货邮行类
  7. 经常有人在农村高价回收旧手机,啥样的都要,不赔钱吗?
  8. 1.hacking-lab基础关[详细writeup]
  9. 观测未来,携手同行!驻云诚邀您参加2021 OSCAR 开源产业大会!文末报名福利!
  10. 我也是“抽象派画家”!