Error get last: примеры (PHP)

Функция error_get_last в PHP: обработка и анализ ошибок
Раздел: Обработка ошибок
error_get_last: ?array

Основы функции error_get_last

Описание и назначение

Функция error_get_last() возвращает информацию о последней произошедшей ошибке в виде ассоциативного массива или null, если ошибок не было. Эта функция полезна для отлова фатальных ошибок, которые не перехватываются стандартными обработчиками.

Когда используется

Функция применяется в ситуациях, когда необходимо протоколировать или обрабатывать ошибки, возникшие во время выполнения скрипта, особенно после завершения работы или в обработчиках завершения. Типичное использование включает логирование, отладку и создание пользовательских систем обработки ошибок.

Возвращаемое значение

Функция не принимает параметров. Возвращает массив с ключами:

  • type - тип ошибки (числовой код)
  • message - текст сообщения об ошибке
  • file - имя файла, в котором произошла ошибка
  • line - номер строки, в которой произошла ошибка

Если ошибок не было, функция возвращает null.

Базовые примеры использования

Пример 1: Получение информации о последней ошибке
<?
// Генерируем ошибку
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
)
Пример 2: Проверка отсутствия ошибок
<?
// Нет ошибок
$error = error_get_last();
var_dump($error);
?>
NULL
Пример 3: Использование с подавлением ошибок
<?
@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

set_error_handler()

Позволяет задать пользовательский обработчик ошибок. Более гибкий подход для обработки ошибок во время выполнения скрипта. Используется, когда требуется централизованная обработка всех ошибок.

ini_set('display_errors', 0) с логированием

Отключение вывода ошибок на экран с одновременным их сохранением в лог-файл. Применяется в production-среде для безопасности и отладки.

Exception и try-catch блоки

Объектно-ориентированный подход к обработке исключительных ситуаций. Предпочтителен для обработки ошибок в современном коде, особенно при работе с классами и библиотеками.

Устанавливает уровень отчетности об ошибках. Используется для настройки того, какие ошибки будут обрабатываться, но не предоставляет информации об отдельных ошибках.

Аналоги в других языках программирования

Python: sys.last_value
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
JavaScript: window.onerror и try-catch
// Глобальный обработчик
window.onerror = function(message, source, lineno, colno, error) {
    console.log('Ошибка:', message);
    return true;
};

// Или через try-catch
try {
    undefinedFunction();
} catch(e) {
    console.log('Поймана ошибка:', e.message);
}
MySQL: GET DIAGNOSTICS
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
    GET DIAGNOSTICS CONDITION 1
        @p1 = MYSQL_ERRNO,
        @p2 = MESSAGE_TEXT;
    SELECT @p1, @p2;
END;

Распространенные ошибки при использовании

Ошибка 1: Непонимание времени вызова
<?
// Ошибка происходит здесь
strpos();

// Но вызывается другая функция, которая может перезаписать ошибку
file_get_contents('файла_нет.txt');

$error = error_get_last(); // Вернет ошибку file_get_contents, а не strpos
print_r($error);
?>
Ошибка 2: Ожидание перехвата фатальных ошибок в том же контексте
<?
// Фатальная ошибка - функция не может быть перехвачена в том же контексте
eval('невалидный_код');

// Этот код никогда не выполнится
$error = error_get_last();
?>
Ошибка 3: Игнорирование reset() ошибок
<?
@strpos(); // Подавленная ошибка

// Некоторые функции могут сбрасывать последнюю ошибку
error_clear_last();

$error = error_get_last(); // Вернет null
var_dump($error);
?>

Изменения в последних версиях PHP

PHP 8.0.0

Изменен уровень ошибки E_NOTICE при передаче неверного количества аргументов в функцию с E_WARNING. Это влияет на значение type в возвращаемом массиве.

PHP 7.0.0

Добавлена функция error_clear_last() для очистки последней ошибки. До этой версии для очистки необходимо было использовать @ оператор с вызовом функции, которая не генерирует ошибок.

PHP 5.2.0

Функция стала доступна по умолчанию, ранее требовалось включить определенные расширения.

Расширенные примеры использования

Пример 1: Логирование ошибок в файл
Пример php
<?
// Устанавливаем обработчик завершения
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();
?>
Пример 2: Комбинирование с пользовательским обработчиком
Пример php
<?
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);
?>
Пример 3: Обработка разных типов ошибок
Пример php
<?
// Генерируем несколько типов ошибок
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";
    }
}
?>
Пример 4: Использование в классах
Пример php
<?
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();
?>

PHP error_get_last function comments

En
Error get last Get the last occurred error