PHP исключение путаница путаница - PullRequest
0 голосов
/ 02 июня 2018

Я прочитал, что, когда исключение выдается внутри метода класса, выполнение останавливается, и исключение пузырится в стеке вызовов, ища немедленный блок 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 голосов
/ 22 августа 2018

Я взял ваш код и добавил печать с обратной трассировкой и выполнение кода, чтобы вы могли видеть, что происходит.

Ответом на ваш вопрос будет то, что программа продолжает выполнение в части catch блока try 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]

, поэтому ответом на ваш вопрос будет то, что программа продолжает выполнение в части catch блока try catch и переходит к коду после него, когда это делается с ошибкой.

Вот код, который я использовал для этого отпечатка, чтобы вы могли поиграть с ним самостоятельно.

class Foo
{

    public function methodOne()
    {
        $this->methodTwo();
        echo "<p>methodOne continuing execution</p>";
        debug_print_backtrace();
        echo "<hr>";
    }

    public function methodTwo()
    {
        try {
            $this->methodThree();
        } catch (Exception $e) {
            echo "<p>methodTwo caught error</p>";
            debug_print_backtrace();
            echo "<hr>";
        }

        echo "<p>methodTwo continuing execution</p>";
        debug_print_backtrace();
        echo "<hr>";
    }

    public function methodThree()
    {
        debug_print_backtrace();
        echo "<hr>";
        throw new Exception('exception happened');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...