error_get_last()
Aprende a usar error_get_last() en PHP para inspeccionar el último error registrado: tipo, mensaje, archivo y línea.
El manejo de errores es una parte importante de la programación en PHP, ya que los errores pueden ocurrir en cualquier momento durante la ejecución. La función error_get_last() es una función integrada de PHP que te permite inspeccionar el error más reciente que PHP registró — su tipo, mensaje, archivo y línea — para que puedas registrarlo o reaccionar a él en el código. Este capítulo explica qué devuelve la función, cuándo devuelve null, qué tipos de errores captura y cuáles no, y cómo usarla correctamente en PHP moderno.
Qué devuelve error_get_last()
error_get_last() no recibe argumentos y devuelve información sobre el último error que PHP generó durante la solicitud actual. El valor de retorno es una de dos cosas:
- Un array asociativo con cuatro claves, si ha ocurrido un error.
null, si aún no se ha registrado ningún error.
El array tiene la siguiente forma:
[
'type' => 2, // int: the error level (E_WARNING here)
'message' => 'fopen(...): ...', // string: the error description
'file' => '/path/to/script.php', // string: file where the error happened
'line' => 12, // int: line number where it happened
]El elemento type es un entero que coincide con una de las constantes de nivel de error de PHP — por ejemplo E_WARNING (2), E_NOTICE (8), E_USER_WARNING (512) o E_DEPRECATED. Consulta la referencia de errores de PHP para ver la lista completa.
Qué captura y qué no captura
Esta es la parte que la gente suele malinterpretar, por lo que vale la pena ser preciso:
- Sí captura errores reportados, advertencias, avisos y deprecaciones — todo lo que fluye a través del mecanismo de error normal de PHP, incluyendo los generados con
trigger_error(). - No captura excepciones. En PHP moderno (7.0+), muchos fallos lanzan excepciones en lugar de generar errores — por ejemplo, la división y el módulo por cero lanzan
DivisionByZeroError, no una advertencia. Esos deben manejarse contry/catch, yerror_get_last()no los verá. - Solo ve los errores que realmente son reportados. Si un nivel de error es filtrado por
error_reporting(), no aparecerá. Activaerror_reporting(E_ALL)durante la depuración para que nada se descarte silenciosamente.
Por esta razón, error_get_last() es más útil justo después de una función integrada que señala un fallo mediante una advertencia (como fopen(), file_get_contents() o unlink()), y dentro de una función de apagado personalizada para capturar un error fatal que terminó la solicitud.
Ejemplos
Leer la última advertencia de un fopen() fallido
Funciones como fopen() devuelven false y generan un E_WARNING cuando fallan. El operador @ suprime la advertencia para que no se imprima, mientras que error_get_last() todavía puede leerla:
<?php
error_reporting(E_ALL);
$handle = @fopen("/no/such/file.txt", "r");
if ($handle === false) {
$error = error_get_last();
echo "Type: " . $error['type'] . "\n";
echo "Message: " . $error['message'] . "\n";
echo "Line: " . $error['line'] . "\n";
}
?>Salida:
Type: 2
Message: fopen(/no/such/file.txt): Failed to open stream: No such file or directory
Line: 4El type es 2, que es el valor de la constante E_WARNING, y el mensaje proviene directamente de fopen().
Capturar un error generado manualmente
Puedes registrar tu propio error con trigger_error() y luego leerlo:
<?php
error_reporting(E_ALL);
ini_set('display_errors', '0');
trigger_error("Invalid configuration value", E_USER_WARNING);
$error = error_get_last();
echo "Message: " . $error['message'] . "\n";
echo "Type: " . $error['type'] . "\n"; // 512 = E_USER_WARNING
?>Salida:
Message: Invalid configuration value
Type: 512Cuando no ha ocurrido ningún error
Si aún no ha salido nada mal, la función devuelve null, así que comprueba siempre antes de leer las claves del array:
<?php
$error = error_get_last();
var_dump($error); // NULL — guard against this before using $error['message']
?>Salida:
NULLErrores comunes
- Comprueba siempre si el resultado es null (
if ($error !== null)) antes de acceder a$error['message'], o generarás una nueva advertencia "trying to access array offset on null". - La división por cero ya no es una advertencia. Usa
try/catchparaDivisionByZeroError;error_get_last()no lo reportará. - Para el registro programático en lugar de la inspección, considera combinar esto con
error_log()o un manejador personalizado registrado medianteset_error_handler().
Conclusión
error_get_last() te proporciona el tipo, mensaje, archivo y línea del error más reciente que PHP registró, o null si no hubo ninguno. Úsala justo después de una función integrada que falle con una advertencia, o dentro de una función de apagado — y recuerda que las excepciones (incluida la división por cero moderna) necesitan try/catch en su lugar.