PHP异常机制的原理是什么
每一个
独立的
运算阵列,可以
运行在PHP上zend_handle_exception是什么
让我们从一个问题开始。上周,blue5tar提了一个问题:对于下面的代码,
执行OnError显然是例外,但没有执行它。为什么
复制代码代码如下所示:
< PHP
函数的误差(errcode美元,errmesg美元美元美元,errfile,errline){
发生
错误;
抛出异常($ errmesg);
}
函数例外(e){
echo $ E -> GetMessage();
}
set_error_handler(错误);
set_exception_handler(例外);
我不会把
文件命名到我的
名字,这样文件就不存在了。
要求(laruence .php);
运行结果:
复制代码代码如下所示:
发生错误
php错误主要():没有开放required' laruence.php
首先,我们需要知道,当需求包含一个找不到的问题时,它会抛出两个错误。
复制代码代码如下所示:
警告:当PHP试图打开此文件时,它将被抛出。
e_compile_error:一个函数,打开一个文件从PHP返回失败后
我们知道,set_error_handler无法捕捉的e_compile_error错误:
下列错误
类型不能用
用户定义的A、a
所以,在OnError,第一次警告错误只能被抓获,关进OnError例外不是
默认的exception_handler捕获。
这是说PHP的异常机制。
这是我们大家都知道的,就是理解原理PHP
操作码。在PHP5.3,运算阵列的每一操作码(文件、函数、
方法)可以独立运行,什么是操作码用来做什么
原来,在PHP中,当异常抛出,你跳到每一个运算阵列执行zend_handle_exception的最后一行,这是如下:
复制代码代码如下所示:
无效on_throw_exception(zval异常tsrmls_dc){
1。判断是否异常抛出
2。记录异常
三.记录下一个要执行的OP行的序列号。
4。要执行的下一个OP行序列号=当前运算阵列的最后一个
}
嗯,就像重写IP登记,重写下OP线序号执行会改变
程序的流动方向,使其进入zend_handle_exception
处理逻辑。
在zend_handle_exception,它将确定异常是在尝试抓住,
复制代码代码如下所示:
如果是,则要执行的下一个OP行被
设置为第一catch的OP行并继续执行。
如果你不摧毁一些变量,你不需要,和opline,然后完成直接。
一些学生想问:
什么时候set_exception_handler设置异常处理
功能(默认user_exception_handler)
工作 好的,它是默认的异常处理程序,判断在完成
退出循环之后是否有默认的异常处理函数,如果有调用的话:
复制代码代码如下所示:
实现
zend_execute(如(active_op_array)tsrmls_cc);
如果(例如(例外)){
如果(如(user_exception_handler)){
调用用户定义的默认异常处理函数
{人}
未捕获的异常
}
{人}
无异常
}
destroy_op_array(如(active_op_array)tsrmls_cc);
饱和(如(active_op_array));
PHP的异常流量
注:在图是不严谨的,这是一点,当最后一个catch块是确定的,它将在同一时间确定(is_a),如果它是进入最后一个catch块。
PHP将直接zend_bailout遇到致命错误时,和zend_bailout将导致程序流程跳过上面的代码片段,或者可以解释为直接出口(longjmp),导致user_exception_handler没有机会采取行动。
知道这一点,我认为文章开头的问题很清楚。
最后,在zend_handle_exception,学生可能会有疑问:如果是这样,为什么运算阵列zend_handle_exception每个独立的执行终于有了最简单的,如果一个函数不抛出,然后操作码显然是不需要啊,嘿,你很聪明,PHP 5.3,根据自己的想法去适应。在把唯一的一次,将动态生成的zend_handle_exception opline。
PHP5的更新日志:
更改异常处理。现在每个op_array不含zend_handle_exception码在