我读到当在类方法中抛出异常时,执行停止并且异常在调用堆栈中冒泡,寻找相同异常类型的立即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
中的异常?
或者换句话说,在捕获到异常之后,它是否会保留调用堆栈?
答案 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]