2010-05-25 3 views
7

По умолчанию Xdebug свалит любое исключение, независимо от того, пойман или нет:Отключение 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 

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

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

UPDATE: Я собираюсь сделать вывод, что это ошибка, так как xdebug.show_exception_trace отключена по умолчанию пока он не ведет себя так, как ожидалось (с помощью Xdebug v2.0.5 с PHP 5.2.10 на Ubuntu 9.10).

ответ

9

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

xdebug.show_exception_trace

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

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

+0

Я согласен, что это имеет какое-то отношение к xdebug.show_exception_trace. Я думаю, что, когда он установлен в 0, он должен игнорировать обнаруженные исключения, но почему-то это не работает даже при отключении его явно. – nuqqsa

+0

Поговорите с Дериком на # php.pecl @ EFNet или используйте трекер ошибок по адресу http://bugs.xdebug.org/ – Artefacto

+0

Этот последний комментарий завершает ваш ответ :) Я определенно собираюсь сообщить об этой ошибке, если смогу все еще воспроизводят его в 2.1.0RCx. Благодарю. – nuqqsa

1

Если ваш код с пространством имен, блок улова должен ссылаться \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 

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

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