2015-10-10 3 views
1

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

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

<?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

Вы получаете исключение, которое останавливает его распространение. Затем вы выбрасываете другое исключение (тот факт, что один связан с другим, не имеет значения), который распространяется с этого момента. Чего вы ожидали? –

ответ

0

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

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

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

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

Смежные вопросы