Исключительный поток понимания PHP

1

Я просматриваю документы PHP для класса Exception, и я довольно новичок в OOP PHP и, следовательно, для обработки исключений с предопределенными PHP и классами SPL.

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

<?php

class MyCustomException extends Exception {}

function doStuff() {
    try {
       throw new InvalidArgumentException("You are doing it wrong!", 112);
   } catch(Exception $e) {
    throw new MyCustomException("Something happened", 911, $e);
    }
}


try {
    doStuff();
} catch(Exception $e) {
 do {
    printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e-   >getCode(), get_class($e));
   } while($e = $e->getPrevious());
 }
   ?>

Вот мое понимание до сих пор.

  1. Парсер интерпретирует функцию и выделяет память для нее.
  2. Он входит в блок try и выполняет dostuff();
  3. Что происходит после этого... и как получается результат в соответствии с последовательностью, как показано ниже, мне не ясно, что первое появление MyCustomException.

/home/bjori/ex.php:8 Something happened (911) [MyCustomException]/home/bjori/ex.php:6 You are doing it wrong! (112) [InvalidArgumentException]

Любой, пожалуйста, пролил свет на это! Большое спасибо !

  • 0
    Вы ловите исключение, которое останавливает его распространение. Затем вы выбрасываете другое исключение (тот факт, что одно связано с другим не имеет значения), которое распространяется с тех пор. Чего ты ожидал?
Теги:
exception-handling

1 ответ

0
Лучший ответ

В doStuff(); вы бросаете сначала InvalidArgumentException (первое исключение) и попадаете в doStuff(); и там вы снова бросаете его как MyCustomException (второе исключение). Таким образом, во внешнем блоке try и catch последнее исключенное исключение представляет собой MyCustomException, и поэтому предыдущим исключением является /InvalidArgumentException.

http://php.net/manual/en/exception.getprevious.php

Возвращает предыдущее исключение (третий параметр Exception :: __ construct()).

Надеюсь, это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню