Отключение дампа отловленных исключений в Xdebug - PullRequest
7 голосов
/ 25 мая 2010

По умолчанию Xdebug выводит любое исключение независимо от того, перехвачено оно или нет:

try {
    throw new Exception();
}
catch (Exception $e) {
}
echo 'life goes on';

При включенном XDebug и настройках по умолчанию этот фрагмент кода будет выводить что-то вроде следующего (красиво отформатированного):

( ! ) Exception: in /test.php on line 3 Call Stack
#   Time    Memory  Function    Location 1  0.0003  52596   {main}( )   ../test.php:0
life goes on

Можно ли отключить это поведение и сбросить только неперехваченные исключения?

Заранее спасибо.

ОБНОВЛЕНИЕ : я собираюсь сделать вывод, что это ошибка, поскольку xdebug.show_exception_trace по умолчанию отключен, но не работает должным образом (при использовании Xdebug v2.0.5 с PHP 5.2.10 в Ubuntu 9.10).

Ответы [ 2 ]

9 голосов
/ 25 мая 2010

Изменить параметр xdebug.show_exception_trace (обратите внимание, что по умолчанию он не включен).

xdebug.show_exception_trace

Тип: целое число, Значение по умолчанию: 0

Если для этого параметра задано значение 1, Xdebug будет отображать трассировку стека при каждом возникновении исключения - даже если это исключение фактически перехвачено.

1 голос
/ 05 октября 2013

Если ваш код является пространством имен, блок catch должен ссылаться на \Exception - с обратной косой чертой - если обратной косой черты нет, PHP будет искать Exception в вашем текущем пространстве имен. Обычно это не удается, и необработанное исключение передается в Xdebug.

Следующий код передает исключение в Xdebug:

namespace foo;

try {
    new \PDO(0);
} catch (Exception $e) {
    echo "Caught!";
}
// Fatal error: Uncaught exception...

Добавление обратной косой черты перед Exception будет искать (и находить) Exception в глобальном пространстве имен:

namespace foo;

try {
    new \PDO(0);
} catch (\Exception $e) {
    echo "Caught!";
}
// Exception caught correctly

Ручная выдача исключений может привести к путанице (вот почему я использовал PDO выше). Если мы попытаемся выбросить исключение из текущего пространства имен, PHP скажет нам, что исключения там не существует:

namespace foo;

try {
    throw new Exception();
} catch (Exception $e) {
    echo "Caught!";
}
// Fatal error: Class 'foo\Exception' not found

Сгенерировать глобальное исключение без глобальной ссылки в блоке catch по-разному:

namespace foo;

try {
    throw new \Exception();  // global Exception
} catch (Exception $e) {
    echo "Caught!";
}
// Fatal error: Uncaught exception 'Exception' in...

В свете всего этого, вероятно, будет хорошей идеей всегда ставить префикс Exception перед косой чертой.

namespace foo;

try {
    throw new \Exception();
} catch (\Exception $e) {
    echo "Caught!";
}
// Exception caught correctly
...