PHP 5.3 Проверка исправности исключений - действительно ли PHP печатает внутреннее сообщение об исключении? - PullRequest
1 голос
/ 01 июня 2011

Я думаю, что это немного странно.

Я запускаю скрипт, который запускает программу.Я храню последний вывод в переменной.Если программа или мой сценарий по разным причинам вызывают исключение в сценарии, я перехватываю это исключение, добавляю журнал ошибок и перебрасываю его.Несколько уровней выше я снова ловлю его, записываю общее сообщение и перебрасываю его, чтобы завершить работу сценария.

Когда умирает командная строка PHP, кажется, что в трассировке стека выводится только внутреннее сообщение об исключении,потому что нет никакого упоминания о моем сообщении.Он даже говорит Uncaught «Exception», которое является внутренним исключением, которое я выбрасываю при тестировании, в то время как внешнее исключение является пользовательским типом.getMessage () возвращает полное сообщение, как и ожидалось.

PHP Fatal error:  Uncaught exception 'Exception' with message 'This is a test error message.' in /home/x/Documents/project/file.php:14

Трассировка стека:

Я сошел с ума, это ожидаемое поведение?Должен ли я идти спать?

ОБНОВЛЕНИЕ :

На уровне «корень» у меня есть это:

    catch(Exception $e)
    {
        $access->logError($e->getMessage());
        print 'Actual error: ' . $e->getMessage() . "\n";
        print get_class($e);
        throw $e;       
    }

print-Statement печатаетреальное сообщение, которое я ожидаю, совокупность.throw $ e возвращает внутреннее сообщение об исключении ... print get_class($e) печатает CustomException ...

Это объявление CustomException:

class CustomException extends Exception
{
    function __construct($message, $prev)
    {
        parent::__construct($message, -1, $prev);
    }
}

Вот как оно используется:

 catch(Exception $e)
{
    $message = $e->getMessage() . $logString;
    $resultReporter->reportError($message);
    $e = new CommandException($message, $e);
    $throw e;
}

1 Ответ

2 голосов
/ 01 июня 2011

Оказывается после всего этого, я думаю, это ожидаемое поведение.

Похоже, что PHP работает в обратном направлении вверх по стеку исключений, когда у него есть возможность отобразить его.

См. Следующий вывод:

Rudis-Mac-Pro:~ rudi$ php ex.php 
PHP Fatal error:  Uncaught exception 'Exception' with message 'I'm an inner exception' in /Users/rudi/ex.php:3
Stack trace:
#0 {main}

Next exception 'Exception' with message 'I'm the outer exception' in /Users/rudi/ex.php:6
Stack trace:
#0 {main}

Next exception 'Exception' with message 'I'm the reeally outer exception' in /Users/rudi/ex.php:8
Stack trace:
#0 {main}
  thrown in /Users/rudi/ex.php on line 8

Это было получено из довольно простого кода:

<?php
try {
    throw new Exception("I'm an inner exception");
} catch(Exception $ex) {
    try {
        throw new Exception("I'm the outer exception", -1, $ex);
    } catch(Exception $iex) {
        throw new Exception("I'm the reeally outer exception", -1, $iex);
    }
}

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

Теперь иди спать; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...