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