getMessage()
Узнайте, как метод PHP Exception::getMessage() извлекает сообщение об ошибке из перехваченного исключения, с примерами и рекомендациями.
Введение
Обработка исключений в PHP позволяет отделить код, который обнаруживает проблему, от кода, который на неё реагирует. Когда что-то идёт не так, вы throw объект исключения, который перемещается вверх по стеку вызовов до тех пор, пока подходящий блок catch не перехватит его. Этот объект содержит сведения о произошедшем — и наиболее часто используемое из них — удобочитаемое сообщение об ошибке.
В этой главе рассматривается Exception::getMessage() — метод, возвращающий эту строку сообщения. Вы узнаете, что он возвращает, чем отличается от других методов-«геттеров» объекта исключения, о типичных подводных камнях, а также о том, как использовать его для пользовательских сообщений, логирования и отладки.
Что возвращает getMessage()
getMessage() возвращает строку сообщения, переданную в качестве первого аргумента конструктору исключения. PHP сохраняет эту строку в объекте исключения в момент его создания, а getMessage() просто считывает её обратно.
<?php
$e = new Exception("Something went wrong");
echo $e->getMessage(); // Something went wrongДва факта, которые стоит запомнить:
- Метод не принимает аргументов и всегда возвращает
string. - Если конструктору не было передано сообщение, он возвращает пустую строку (
""), а неnull.
<?php
$e = new Exception(); // no message
var_dump($e->getMessage()); // string(0) ""getMessage() определён в базовом классе Exception (и в Error), поэтому он доступен для каждого встроенного и пользовательского исключения — RuntimeException, InvalidArgumentException, TypeError и любого класса, расширяющего их.
Синтаксис
final public Exception::getMessage(): stringМетод является final, что означает: подклассы не могут его переопределить — сообщение, переданное в new Exception("..."), будет возвращено именно таким.
Базовое использование
Чтобы прочитать сообщение, перехватите исключение в блоке try/catch. Блок try содержит код, который может завершиться ошибкой; блок catch выполняется только при возникновении исключения.
<?php
function divide($a, $b) {
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero.");
}
return $a / $b;
}
try {
echo divide(10, 0);
} catch (Exception $e) {
echo "Caught: " . $e->getMessage();
}
?>Вывод:
Caught: Cannot divide by zero.InvalidArgumentException расширяет Exception, поэтому блок catch (Exception $e) всё равно его перехватит, а getMessage() вернёт пользовательскую строку, переданную при выбросе исключения.
Практические примеры использования
Логирование ошибок
Распространённый шаблон — запись сообщения в лог для последующего анализа сбоев. Сочетайте getMessage() с getCode(), getFile() и getLine() для более подробных записей в логе.
<?php
try {
throw new RuntimeException("Database connection failed");
} catch (RuntimeException $e) {
$entry = sprintf("[%s] %s", date("Y-m-d"), $e->getMessage());
echo $entry;
}
?>Вывод (дата будет различаться):
[2026-06-21] Database connection failedПоказ безопасного сообщения пользователю
Сообщения исключений нередко содержат технические подробности. Используйте getMessage() для логов, но в продакшене показывайте пользователям общее сообщение, чтобы не раскрывать внутренние детали — пути к файлам или SQL-запросы.
<?php
try {
throw new Exception("SQLSTATE[28000]: Invalid password for user 'root'");
} catch (Exception $e) {
error_log($e->getMessage()); // full detail goes to the log
echo "Sorry, something went wrong."; // safe message for the user
}
?>getMessage() против других геттеров исключений
getMessage() — один из нескольких методов только для чтения объекта исключения. Понимание того, что возвращает каждый из них, поможет выбрать нужный:
| Метод | Возвращает |
|---|---|
getMessage() | Строку сообщения, переданную конструктору |
getCode() | Целочисленный (или строковый) код ошибки |
getFile() | Файл, в котором было создано исключение |
getLine() | Номер строки, в которой оно было создано |
getTrace() | Трассировку стека в виде array |
getPrevious() | Предыдущее исключение в цепочке, если есть |
Если для отладки нужно всё сразу, приведение исключения к строке (через __toString()) даёт форматированный дамп, уже включающий сообщение, файл, строку и трассировку.
Подводные камни
- Пустая строка, не null. Как показано выше, исключение без сообщения возвращает
"". Код видаif ($e->getMessage())воспримет это как ложное значение — учитывайте это, если пустое сообщение имеет смысл в вашей предметной области. getMessage()являетсяfinal. Вы не можете переопределить его для преобразования текста. Чтобы настроить то, что видят вызывающие, передайте нужную строку конструктору (как правило, черезparent::__construct($message)в пользовательском классе исключения).fopen()по умолчанию не выбрасывает исключений. Многие PHP-функции генерируют предупреждения и возвращаютfalseвместо того, чтобы бросать исключения. В приведённом ниже примере с файлом мы проверяем возвращаемое значение и бросаем исключение вручную; такие функции не заполнятgetMessage()сами по себе, если только вы не преобразуете предупреждение в исключение (например, с помощьюset_error_handler()).
Полный пример
<?php
try {
// fopen() returns false and emits a warning on failure rather than throwing
$file = @fopen("does-not-exist.txt", "r");
if (!$file) {
throw new Exception("File not found");
}
} catch (Exception $e) {
echo "Error message: " . $e->getMessage();
}
?>Вывод:
Error message: File not foundЗдесь мы открываем файл, обнаруживаем сбой, проверяя возвращаемое значение fopen(), и бросаем Exception с пользовательским сообщением. getMessage() затем извлекает эту строку, чтобы мы могли отобразить или записать её в лог. Для гарантированной очистки независимо от успеха или неудачи следует добавить блок finally.
Заключение
Exception::getMessage() возвращает сообщение об ошибке, хранящееся в перехваченном исключении — строку, переданную конструктору, или пустую строку, если сообщение не указано. Это простейший и наиболее используемый геттер исключений, идеально подходящий для логирования, отладки и формирования пользовательских сообщений. Комбинируйте его с другими геттерами, такими как getCode() и getTrace(), для создания полных отчётов об ошибках, и изучите общую модель обработки исключений в PHP для его эффективного использования.