php中的error_handler

news/2024/7/4 9:41:44

一般我们为了捕获php的错误,需要自己设置error_handler,但是,如果error_handler里出错了,可能会形成递归调用。事实上这个问题根本不存在,因为php在出错以后调用了zend_error函数,然后这个函数里会判断EG(user_error_handler)是否存在,如果存在则用call_user_function_ex来调用用户方法,而在此之前,它会先将EG(user_error_handler)设置为null,这样一来如果出错的话,则不会递归进入call_user_function_ex了。

具体代码如下:

orig_user_error_handler = EG(user_error_handler); EG(user_error_handler) = NULL;

exception_handler的实现却不同,因为exception其实是一个顺着栈往上传递的,因此对它的处理一定得在最上层,所以我们可以看到zend_execute_scripts里对exception进行了处理。在execute开始之前一定先要判断有没有exception,如果有则直接退出,不停地这样子退栈。而set_exception_handler的用户自定义函数最终会被call_user_function_ex调用,调用之后如果调用失败了,它会检查有没有EG(exception),如果有,则转到zend_exception_error,这个是默认实现,换句话说,也不会递归。

具体的代码如下:

zend_execute(EG(active_op_array) TSRMLS_CC); if (EG(exception)) { if (EG(user_exception_handler)) { zval *orig_user_exception_handler; zval ***params, *retval2, *old_exception; params = (zval ***)emalloc(sizeof(zval **)); old_exception = EG(exception); EG(exception) = NULL; params[0] = &old_exception; orig_user_exception_handler = EG(user_exception_handler); if (call_user_function_ex(CG(function_table), NULL, orig_user_exception_handler, &retval2, 1, params, 1, NULL TSRMLS_CC) == SUCCESS) { if (retval2 != NULL) { zval_ptr_dtor(&retval2); } } else { if (!EG(exception)) { EG(exception) = old_exception; } zend_exception_error(EG(exception) TSRMLS_CC); }


http://www.niftyadmin.cn/n/2087621.html

相关文章

NumPy基础学习笔记

目录一、NumPy简介与安装使用介绍1.1 NumPy的简介1.2 Numpy的安装与使用1.3 NumPy常用数据类型介绍二、NumPy数组与矩阵的创建2.1 NumPy基本数组的创建2.1.1 一维数组的创建2.1.2 二维及高维数组的创建2.1.3 添加、删除和排序元素2.1.4 重塑阵列2.1.5 如何向数组中添加新的轴2.…

一个编译debug版本的mysql的脚本

#!/bin/sh #设置安装目录 MYSQL_HOME/home/mysql/install/ddb if [ -z $MYSQL_HOME ]; then echo "mysql_home should be set" exit -1 fi #为防止-O参数导致的gdb行数错乱,将其暂时禁掉 sed -i -r "s/-O[0-9]?/b//g" configure #任何一步执行…

学习笔记十二 : squid

一 squid简介二 squid 安装配置三 案例转载于:https://blog.51cto.com/chenwei/1841972

工作中电子邮件的技巧

虽然电子邮件的使用几乎遍及全球,但并非人人都懂得如何正确使用。以下的使用指南,内容将涵盖邮件礼节以及如何处理邮件等方面。这些内容能够帮助你的用户学会如何安全可靠地操作邮件。 1. 管好你的收件箱 把邮件消息按照优先级、主题、日期、发件人及其…

在CentOS6.8上编译安装apache+php+mariadb(整理版)

在CentOS6.8上编译安装apachephpmariadb参考文档: http://www.cnblogs.com/dreamhome/p/4967903.html使用wget或git下载源码速度很慢,使用迅雷下载会比快很多 bison和cmake安装顺序网上的参考教程列出的下载地址部分失效,需要到官方网站重新…

让你的vmware跑的更快!

windows环境下,文本编辑器打开虚拟机的vmx文件,在第二行添加一行: mainmem.usenamedfile"false" 意思是优先使用物理内存而不是硬盘虚拟内存。 如果是mac os x环境下的fusion下选择高级-其他-硬盘缓冲&…

GIS实验之制作行政区划图

数据描述:提供山东省的基础地理信息数据问题描述:基于这些数据制作行政区划图 形式内容不限,从可视化的角度出发;如果是标准地图,需要遵循地图学的制图原则;如果是可视化示意图,可以不考虑某些制…

用file来识别文件的编码方式

以前其实也有些类似的需求,就是需要判断一个文件的编码方式到底是什么,知道file命令可以,但是遇到某些文件,比如php它只会显示这是一个php文件,并不会显示它的编码方式。今天又重新遇到这个问题,因此仔细看…