getCode()
Узнайте, как метод PHP Exception::getCode() возвращает целочисленный код исключения, с примерами, пользовательскими классами и типичными ошибками.
Метод PHP getCode()
Когда вы перехватываете исключение в PHP, часто нужно знать, какая именно ошибка произошла, чтобы по-разному реагировать на каждую из них. Метод Exception::getCode() даёт именно это: он возвращает целочисленный код ошибки, который был прикреплён к исключению при его создании. На этой странице рассматривается, что представляет собой код, как его задавать и читать, как он ведёт себя в стандартной иерархии исключений, и какие ловушки могут вас подстерегать.
Если вы только знакомитесь с обработкой ошибок, начните с исключений PHP и оператора try-catch, а затем вернитесь сюда.
Что такое код исключения
Каждый объект исключения PHP содержит три ключевых элемента информации: сообщение (читается с помощью getMessage()), строку/файл (читается с помощью getLine()) и код. Код — это значение, определяемое разработчиком, которое передаётся вторым аргументом в конструктор исключения:
new Exception(string $message = "", int $code = 0, ?Throwable $previous = null)getCode() просто возвращает этот второй аргумент. Это метка, которую вы выбираете, — PHP не заполняет её автоматически. Если код не передан, по умолчанию используется 0.
Синтаксис
public Exception::getCode(): mixed- Параметры: отсутствуют.
- Возвращаемое значение: код, переданный в конструктор. Для базового класса
Exceptionэтоint(по умолчанию0).
Примечание: возвращаемый тип задокументирован как
mixed, потому чтоErrorExceptionи некоторые исключения PDO используют string-коды (например, значения SQLSTATE). Для обычногоExceptionследует ожидать целое число.
Базовый пример
Здесь мы бросаем исключение с кодом 100, а затем читаем его в блоке catch:
<?php
try {
throw new Exception("Database connection failed", 100);
} catch (Exception $e) {
echo "Message: " . $e->getMessage() . "\n";
echo "Code: " . $e->getCode() . "\n";
}Вывод:
Message: Database connection failed
Code: 100Обратите внимание: getCode() возвращает 100 — значение, которое мы передали, — а getMessage() возвращает текст. Эти два метода независимы друг от друга.
Ветвление по коду
Весь смысл кода в том, чтобы позволить одному блоку catch направлять разные ошибки в разные обработчики. Приведённые ниже коды — произвольные константы, выбранные для приложения:
<?php
const ERR_DB = 100;
const ERR_NOT_FOUND = 404;
function loadUser(int $id): string
{
if ($id < 1) {
throw new Exception("Invalid user id", ERR_NOT_FOUND);
}
// ...imagine a DB lookup that fails...
throw new Exception("Could not reach the database", ERR_DB);
}
try {
echo loadUser(0);
} catch (Exception $e) {
switch ($e->getCode()) {
case ERR_NOT_FOUND:
echo "404: " . $e->getMessage();
break;
case ERR_DB:
echo "500: " . $e->getMessage();
break;
default:
echo "Unknown error: " . $e->getMessage();
}
}Вывод:
404: Invalid user idПоскольку мы вызвали loadUser(0), проверка $id < 1 бросает исключение первой с ERR_NOT_FOUND (404), и выполняется соответствующий case.
Код по умолчанию равен 0
Если создать исключение без кода, getCode() вернёт 0, а не null:
<?php
try {
throw new Exception("Something went wrong");
} catch (Exception $e) {
var_dump($e->getCode());
}Вывод:
int(0)Это важно учитывать при ветвлении по коду: if ($e->getCode()) воспринимает отсутствующий код (0) как ложное значение, что обычно и требуется, — но стоит делать это осознанно.
Пользовательские классы исключений
Распространённый паттерн — встраивать код в специальный класс исключений, чтобы вызывающий код не запоминал «магические числа»:
<?php
class HttpException extends Exception {}
class NotFoundException extends HttpException
{
public function __construct(string $message = "Not Found")
{
parent::__construct($message, 404);
}
}
try {
throw new NotFoundException("User profile not found");
} catch (HttpException $e) {
echo $e->getCode() . " " . $e->getMessage();
}Вывод:
404 User profile not foundКонструктор NotFoundException передаёт 404 в parent::__construct(), поэтому getCode() возвращает 404, даже если вызывающий код никогда явно не указывал это число.
getCode() vs. getMessage() vs. getPrevious()
| Метод | Возвращает | Использование |
|---|---|---|
getCode() | Целочисленный код, который вы передали | Ветвление/логирование по типу ошибки |
getMessage() | Понятное человеку сообщение | Отображение или логирование того, что пошло не так |
getPrevious() | Прикреплённое внутреннее исключение (или null) | Сохранение первоначальной причины при повторном выбросе |
Эти методы дополняют друг друга — большинство реальных обработчиков читают все три.
Типичные ловушки
- Код должен быть целым числом для
Exception. Передача string (например,new Exception("x", "ABC")) вызываетTypeErrorв современном PHP. Используйте константы. getCode()— это не HTTP-код статуса. Это код статуса только в том случае, если вы решили хранить его там. PHP никак не использует это значение само по себе.- Встроенные исключения редко устанавливают значимый код. Большинство базовых PHP-исключений оставляют его равным
0— не полагайтесь на него, если не задали его явно. - Коды
PDOException— это SQLSTATE-string. При перехвате ошибок базы данныхgetCode()может вернуть что-то вроде"42S02"(string), поэтому возвращаемый тип и являетсяmixed.
Рекомендации
- Определяйте именованные константы (или классы исключений) для кодов вместо того, чтобы разбрасывать по коду «магические числа».
- Держите коды стабильными — другой код и логи могут зависеть от них.
- Логируйте код вместе с
getMessage()иgetLine(), чтобы ошибки можно было отследить. - Не передавайте внутренние коды или сообщения конечным пользователям — преобразовывайте их в безопасные, универсальные ответы.
Заключение
Exception::getCode() возвращает целочисленный код, прикреплённый к исключению при его создании, предоставляя надёжный, машиночитаемый способ различать одну ошибку от другой. Сочетайте его с getMessage() для получения понятных человеку деталей, предпочитайте именованные константы или пользовательские классы исключений «магическим числам» и помните, что некоторые типы исключений (например, PDOException) используют string-коды.