PHP异常冒泡混乱

时间:2018-06-02 11:53:43

标签: php exception

我读到当在类方法中抛出异常时,执行停止并且异常在调用堆栈中冒泡,寻找相同异常类型的立即catch块。

以下面的代码为例。

class Foo
{

    public function methodOne()
    {
        $this->methodTwo();
        // more code
    }

    public function methodTwo()
    {
        try {
            $this->methodThree();
        } catch (Exception $e) {

        }
    }

    public function methodThree()
    {
        throw new Exception('exception happened');
    }

}

$foo = new Foo();
$foo->methodOne();

我的问题是,当一个异常被调用堆栈时,执行又从何处开始?  例如上面methodTwo中捕获到异常的情况,执行是否会继续methodOne继续执行methodThree中的异常?

或者换句话说,在捕获到异常之后,它是否会保留调用堆栈?

1 个答案:

答案 0 :(得分:1)

我接受了您的代码,并添加了回溯打印和代码执行功能,因此您可以看到发生了什么。

您的问题的答案是,程序将继续在try catch块的catch部分中执行,并在出错后继续执行代码。

它看起来与此类似(我对原始格式进行了改进)。您可以在下面看到示例。

table[id*="cart_promotions"]::before {
   content: 'Please use promo code FTL-PKG'; 
   text-align: left; 
   visibility: hidden; 
   color:red;
   }

所以您的问题的答案将是程序在try catch块的catch部分中继续执行,并在错误完成后继续执行代码。

这是我用于此打印的代码,因此您可以自己玩。

#0  Foo->methodThree() called at [/php_playground/index.php:25] <br> 
#1 Foo->methodTwo() called at [/php_playground/index.php:16] <br>
#2 Foo->methodOne() called at [/php_playground/index.php:46] <hr>

methodTwo caught error
#0  Foo->methodTwo() called at [/php_playground/index.php:16] <br>
#1  Foo->methodOne() called at[/php_playground/index.php:46] <hr> 

methodTwo continuing execution
#0  Foo->methodTwo() called at [/php_playground/index.php:16] <br>
#1  Foo->methodOne() called at [/php_playground/index.php:46] <hr> 

methodOne continuing execution
#0  Foo->methodOne() called at [/php_playground/index.php:46]