thinkphp6.0--------异常类

一、初始化

在App类中,有属性initializers:应用初始化器,其中有元素Error::class,在方法initialize中对属性initializers中的元素进行了初始化操作:调用对应类的init方法,Error类的init方法进行异常的初始化。

error_reporting :设置应该报告何种 PHP 错误

set_error_handler:设置用户自定义的错误处理函数

set_exception_handler:设置用户自定义的异常处理函数

register_shutdown_function:注册一个会在php中止时执行的函数(如:执行exit后再执行)

二、相关错误信息处理流程

在程序中手动抛出异常,要注意Pipeline类中接收的异常处理方法是什么(如:接收的是Middleware类中的handleException方法)

1.Error类:程序运行出现错误时,接收并处理错误信息

init:初始化,调用前面的四个函数

appException:set_exception_handler函数的回调函数参数(异常)

(1)调用getExceptionHandler方法获取Handler类

(2)调用Handle类的report方法

(3)调用Handle类的render方法

appError:set_error_handler函数的参数(错误)

(1)new一个ErrorException类:四个参数   错误类型   错误内容  错误文件   错误行号 

(2)抛出这个异常类

appShutdown:register_shutdown_function函数的参数

(1)调用函数error_get_last(返回最后发生的错误),获取错误信息,没有错误则为null

(2)并用返回值的type判断错误类型(调用isFatal方法),是否是致命错误

(3)如果前两条判断成功,则将错误托管至ErrorException类,并调用appException方法进行处理

getExceptionHandler:注册一个异常处理类Handle类(在容器App类中)

isFatal:判断错误类型是否致命(根据error_get_last函数返回的type值进行的判断)

2.Handle类--------异常处理类,接收抛出的异常进行处理

成员变量:

app:容器

ignoreReport:保存需要收集异常信息的异常类数组

isJson:判断是否是json请求

成员方法:

report:收集错误信息

(1)调用isIgnoreReport方法判断异常是否在变量ignoreReport中;

(2)如果存在,则记录异常类信息至日志中;

(3)不存在就不进行操作

isIgnoreReport:判断传入的异常是否在变量ignoreReport中

render:异常处理接口,返回Response类

(1)根据请求类判断是否是json请求,设置变量isJson值

(2)根据不同的异常类调用不同的方法(renderHttpException和convertExceptionToResponse),HttpResponseException类异常就直接返回此类的属性Response类

renderForConsole:

renderHttpException:处理HttpException异常类的方法

(1)获取异常的statusCode属性(HttpException类中有定义)和配置(http_exception_template)的模板文件;

(2)如果没有开启debug同时配置的模板文件存在,则直接创建一个Response类并返回

(3)如果上面条件不成立,则调用convertExceptionToResponse方法,返回Response类

convertExceptionToResponse:处理其他异常类的方法

(1)判断属性isJson是否是json请求

(2)如果是json则用convertExceptionToArray方法返回的数组,如果不是json则用renderExceptionContent方法返回的内容创建Response类

(3)如果异常是HttpException类,则设置Response类属性header(HttpException类定义有header属性)

(4)设置Response类的code属性(默认500,如果是HttpException类则是statusCode属性),并返回Response类

convertExceptionToArray:处理异常类的属性,并组装成数组

renderExceptionContent:

(1)ob_start开启缓冲区,调用convertExceptionToArray方法,得到组装后的数组

(2)再对数据进行extract函数处理,使key键值转为变量

(3)include加载显示异常信息的模板文件(配置中的exception_tmpl)

(4)调用ob_get_clean,返回输出缓冲区的内容

getCode:获取异常的编码

getMessage:获取异常的提示信息(用到语言包类和对应的配置)

getSourceCode:获取对应错误文件的错误内容

getExtendData:获取异常类的扩展信息(继承于Exception类的自定义异常类中的getData方法)

getConst:调用get_defined_constants函数获取常量值(键值为user的值)

附:

自定义的异常类Exception类:继承php内置的Exception类,多加了一个扩展数据属性data和这个属性的get/set方法

HttpException类:Http异常类,继承php内置的RuntimeException类,多加了两个属性statusCode和headers,构造函数进行属性的设置,加了两个get方法(注:没有data属性

HttpResponseException:Http响应异常类,继承php内置的RuntimeException类,多加了一个response属性(Response类),构造函数进行此属性的设置,加个对应的get方法

用到的配置:

(app配置文件中)

http_exception_template:配置状态码(HttpException类中的statusCode属性)为key和其对应显示的模板文件路径为值;没有开启debug时,可以根据statusCode值配置对应的模板,如果开启了debug,则模板使用exception_tmpl配置的模板

show_error_msg:是否不显示错误信息

error_message:不显示时的默认信息

exception_tmpl:配置默认的异常输出的模板文件路径

view配置文件中)

type:设置处理模板的引擎类型(目前就只有php,下载下来的代码中设置的是Think,会报错:Driver [Think] not supported.)------------------后面介绍使用模板功能时,会有涉及

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThinkPHP 2.x版本中存在远程代码执行(RCE)漏洞。该漏洞可以通过构造恶意的请求来执行任意的PHP代码。具体来说,漏洞出现在ThinkPHP框架中的路由处理函数中,使用了不安全的preg_replace函数,并且使用了/e模式进行正则表达式匹配。攻击者可以通过在请求中注入恶意的代码来执行任意的PHP代码。这个漏洞在ThinkPHP框架的Dispatcher类中的102行被触发。\[2\]\[3\] 为了修复这个漏洞,建议升级到最新版本的ThinkPHP框架,或者手动修复代码中的漏洞。具体修复方法包括使用更安全的正则表达式替代preg_replace函数,并且避免使用/e模式进行正则表达式匹配。此外,还应该对用户输入进行严格的过滤和验证,以防止恶意代码的注入。 #### 引用[.reference_title] - *1* [【漏洞复现】[ThinkPHP]2-Rce](https://blog.csdn.net/Mr_atopos/article/details/124907676)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [ThinkPHP2-RCE漏洞复现](https://blog.csdn.net/qq_51459600/article/details/125179451)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值