Error get last: примеры (PHP)
error_get_last: ?arrayОсновы функции error_get_last
Функция error_get_last() возвращает информацию о последней произошедшей ошибке в виде ассоциативного массива или null, если ошибок не было. Эта функция полезна для отлова фатальных ошибок, которые не перехватываются стандартными обработчиками.
Функция применяется в ситуациях, когда необходимо протоколировать или обрабатывать ошибки, возникшие во время выполнения скрипта, особенно после завершения работы или в обработчиках завершения. Типичное использование включает логирование, отладку и создание пользовательских систем обработки ошибок.
Функция не принимает параметров. Возвращает массив с ключами:
- type - тип ошибки (числовой код)
- message - текст сообщения об ошибке
- file - имя файла, в котором произошла ошибка
- line - номер строки, в которой произошла ошибка
Если ошибок не было, функция возвращает null.
Базовые примеры использования
<?
// Генерируем ошибку
strpos();
$error = error_get_last();
print_r($error);
?>Array
(
[type] => 2
[message] => strpos() expects at least 2 parameters, 0 given
[file] => /path/to/file.php
[line] => 4
)<?
// Нет ошибок
$error = error_get_last();
var_dump($error);
?>NULL
<?
@file_get_contents('несуществующий_файл.txt');
$error = error_get_last();
print_r($error);
?>Array
(
[type] => 2
[message] => file_get_contents(несуществующий_файл.txt): failed to open stream: No such file or directory
[file] => /path/to/file.php
[line] => 3
)Альтернативные функции в PHP
Позволяет задать пользовательский обработчик ошибок. Более гибкий подход для обработки ошибок во время выполнения скрипта. Используется, когда требуется централизованная обработка всех ошибок.
Отключение вывода ошибок на экран с одновременным их сохранением в лог-файл. Применяется в production-среде для безопасности и отладки.
Объектно-ориентированный подход к обработке исключительных ситуаций. Предпочтителен для обработки ошибок в современном коде, особенно при работе с классами и библиотеками.
Устанавливает уровень отчетности об ошибках. Используется для настройки того, какие ошибки будут обрабатываться, но не предоставляет информации об отдельных ошибках.
Аналоги в других языках программирования
import sys
import traceback
try:
undefined_function()
except:
pass
print(sys.last_value)
print(traceback.format_exc())NameError("name 'undefined_function' is not defined")
Traceback (most recent call last):
File "", line 4, in
NameError: name 'undefined_function' is not defined// Глобальный обработчик
window.onerror = function(message, source, lineno, colno, error) {
console.log('Ошибка:', message);
return true;
};
// Или через try-catch
try {
undefinedFunction();
} catch(e) {
console.log('Поймана ошибка:', e.message);
}DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
@p1 = MYSQL_ERRNO,
@p2 = MESSAGE_TEXT;
SELECT @p1, @p2;
END;Распространенные ошибки при использовании
<?
// Ошибка происходит здесь
strpos();
// Но вызывается другая функция, которая может перезаписать ошибку
file_get_contents('файла_нет.txt');
$error = error_get_last(); // Вернет ошибку file_get_contents, а не strpos
print_r($error);
?><?
// Фатальная ошибка - функция не может быть перехвачена в том же контексте
eval('невалидный_код');
// Этот код никогда не выполнится
$error = error_get_last();
?><?
@strpos(); // Подавленная ошибка
// Некоторые функции могут сбрасывать последнюю ошибку
error_clear_last();
$error = error_get_last(); // Вернет null
var_dump($error);
?>Изменения в последних версиях PHP
Изменен уровень ошибки E_NOTICE при передаче неверного количества аргументов в функцию с E_WARNING. Это влияет на значение type в возвращаемом массиве.
Добавлена функция error_clear_last() для очистки последней ошибки. До этой версии для очистки необходимо было использовать @ оператор с вызовом функции, которая не генерирует ошибок.
Функция стала доступна по умолчанию, ранее требовалось включить определенные расширения.
Расширенные примеры использования
<?
// Устанавливаем обработчик завершения
register_shutdown_function(function() {
$error = error_get_last();
if ($error !== null) {
$log = date('Y-m-d H:i:s') . " - " .
"Type: {$error['type']}, " .
"Message: {$error['message']}, " .
"File: {$error['file']}, " .
"Line: {$error['line']}\n";
file_put_contents('error.log', $log, FILE_APPEND);
}
});
// Генерируем фатальную ошибку
undefined_function();
?><?
set_error_handler(function($errno, $errstr, $errfile, $errline) {
// Обрабатываем ошибку
echo "Поймана ошибка: $errstr\n";
// Возвращаем true, чтобы стандартный обработчик не срабатывал
return true;
});
// Генерируем ошибку
strpos();
// error_get_last() все равно вернет информацию
$last_error = error_get_last();
print_r($last_error);
?><?
// Генерируем несколько типов ошибок
trigger_error("Пользовательская ошибка", E_USER_WARNING);
$error = error_get_last();
if ($error) {
switch ($error['type']) {
case E_ERROR:
echo "Критическая ошибка\n";
break;
case E_WARNING:
case E_USER_WARNING:
echo "Предупреждение\n";
break;
case E_NOTICE:
case E_USER_NOTICE:
echo "Уведомление\n";
break;
default:
echo "Неизвестный тип ошибки\n";
}
}
?><?
class ErrorLogger {
private static $lastError = null;
public static function logError() {
self::$lastError = error_get_last();
if (self::$lastError) {
// Сохраняем в базу данных или файл
self::saveToDatabase(self::$lastError);
}
}
private static function saveToDatabase($error) {
// Логика сохранения
echo "Ошибка сохранена: " . $error['message'] . "\n";
}
}
register_shutdown_function(['ErrorLogger', 'logError']);
// Тестируем
strpos();
?>