Los errores de diagnóstico, también conocidos como errores tradicionales, se
utilizan para señalar diversas condiciones y pueden mostrarse y/o
registrarse según se necesite.
Por defecto, PHP notifica todos los errores de diagnóstico. (Antes de
PHP 8.0.0, los diagnósticos E_NOTICE y
E_DEPRECATED no se notificaban por defecto.)
A diferencia de los errores Throwable, la
mayoría de los errores de diagnóstico no interrumpen el
flujo normal de ejecución.
Los diagnósticos fatales, como E_ERROR, terminan el
script.
Los diagnósticos que se notifican y los que se ignoran se controlan
mediante la directiva de php.ini
error_reporting,
o en tiempo de ejecución llamando a error_reporting().
Se recomienda encarecidamente establecer la directiva de configuración,
ya que algunos errores pueden ocurrir antes de que comience la ejecución
del script.
Nota:
En un entorno de desarrollo,
error_reportingdebería establecerse siempre aE_ALLpara que los problemas señalados por PHP se noten y se corrijan. En producción, el nivel de detalle puede reducirse aE_ALL & ~E_NOTICE & ~E_DEPRECATED, aunque en muchos casosE_ALLsigue siendo apropiado, ya que puede proporcionar una alerta temprana de posibles problemas.
Lo que ocurre con los diagnósticos depende de otras dos directivas de
php.ini.
display_errors
controla si el diagnóstico se muestra como parte de la salida del script.
Esta debería estar siempre desactivada en un entorno de producción, ya que
la salida puede incluir información confidencial, como contraseñas de bases
de datos, pero a menudo es útil activarla en desarrollo, ya que garantiza
la notificación inmediata de los problemas.
Además de mostrar los errores, PHP puede registrar los diagnósticos cuando
la directiva
log_errors
está activada. Esto registrará cualquier diagnóstico en el fichero o en el
syslog definido por
error_log.
Esto puede ser extremadamente útil en un entorno de producción, ya que los
diagnósticos se registran cuando ocurren y después pueden generarse informes
a partir de esos registros.
Los diagnósticos individuales pueden suprimirse utilizando el operador
@.
Antes de PHP 8.0.0, era posible suprimir diagnósticos críticos que terminaban la ejecución del script PHP.
Nota:
Entre versiones de PHP, los diagnósticos pueden añadirse o eliminarse, cambiar su gravedad o elevarse a errores Throwable.
Si el manejo de diagnósticos por defecto de PHP no es adecuado, es posible
sustituir el manejador de diagnósticos por defecto por uno personalizado,
que se establece con set_error_handler().
Algunos diagnósticos, como E_ERROR y
E_PARSE, no pueden manejarse de esta forma (véase
set_error_handler() para la lista completa).
Los demás pueden manejarse de varias maneras. Por ejemplo, un manejador
personalizado puede mostrar una página de error al usuario y notificar el
error de forma más directa que un registro, por ejemplo enviando un correo
electrónico.
Otro uso típico es elevar los errores de diagnóstico a excepciones con ErrorException.
Ejemplo #1 Elevar los errores de diagnóstico a excepciones
<?php
function exceptions_error_handler($severity, $message, $filename, $lineno) {
if (error_reporting() & $severity) {
throw new ErrorException($message, 0, $severity, $filename, $lineno);
}
}
set_error_handler('exceptions_error_handler');Nota:
Es importante comprobar que la gravedad está incluida en la lista actual de diagnósticos notificables; de lo contrario, el operador
@dejará de funcionar, ya que se lanzaría una excepción para un diagnóstico suprimido.
| Versión | Descripción |
|---|---|
| 8.5.0 | Los errores fatales (como un tiempo máximo de ejecución superado) ahora incluyen una traza de la pila en su mensaje de error. |