PHP
Manejo de excepciones y reporte de errores
Buscar..
Configuración de informes de errores y dónde mostrarlos.
Si aún no se ha hecho en php.ini, el informe de errores se puede configurar dinámicamente y se debe configurar para permitir que se muestren la mayoría de los errores:
Sintaxis
int error_reporting ([ int $level ] )
Ejemplos
// should always be used prior to 5.4
error_reporting(E_ALL);
// -1 will show every possible error, even when new levels and constants are added
// in future PHP versions. E_ALL does the same up to 5.4.
error_reporting(-1);
// without notices
error_reporting(E_ALL & ~E_NOTICE);
// only warnings and notices.
// for the sake of example, one shouldn't report only those
error_reporting(E_WARNING | E_NOTICE);
los errores se registrarán de forma predeterminada por php, normalmente en un archivo error.log al mismo nivel que el script en ejecución.
En el entorno de desarrollo, también se pueden mostrar en pantalla:
ini_set('display_errors', 1);
en producción sin embargo, uno debe
ini_set('display_errors', 0);
y mostrar un mensaje de problema amigable mediante el uso de un controlador de Excepción o Error.
Manejo de excepciones y errores.
trata de atraparlo
try..catch
bloques try..catch
se pueden usar para controlar el flujo de un programa donde se pueden lanzar excepciones . Se pueden capturar y manejar con gracia en lugar de dejar que PHP se detenga cuando se encuentra uno:
try {
// Do a bunch of things...
throw new Exception('My test exception!');
} catch (Exception $ex) {
// Your logic failed. What do you want to do about that? Log it:
file_put_contents('my_error_log.txt', $ex->getMessage(), FILE_APPEND);
}
El ejemplo anterior podría catch
la Excepción lanzada en el bloque de try
y registrar su mensaje ("¡Mi excepción de prueba!") A un archivo de texto.
La captura de diferentes tipos de excepción
Puede implementar varias declaraciones catch
para que los diferentes tipos de excepciones se manejen de diferentes maneras, por ejemplo:
try {
throw new InvalidArgumentException('Argument #1 must be an integer!');
} catch (InvalidArgumentException $ex) {
var_dump('Invalid argument exception caught: ' . $ex->getMessage());
} catch (Exception $ex) {
var_dump('Standard exception caught: ' . $ex->getMessage());
}
En el ejemplo anterior, se utilizará la primera catch
, ya que coincide primero en el orden de ejecución. Si intercambiaba el orden de las instrucciones catch
, el catcher Exception
se ejecutaría primero.
De manera similar, si tuviera que lanzar una Exception
UnexpectedValueException
cambio, vería el segundo controlador de una Exception
estándar que se está utilizando.
finalmente
Si necesita hacer algo después de que se haya ejecutado un try
o un catch
, puede usar una sentencia finally
:
try {
throw new Exception('Hello world');
} catch (Exception $e) {
echo 'Uh oh! ' . $e->getMessage();
} finally {
echo " - I'm finished now - home time!";
}
El ejemplo anterior daría como resultado lo siguiente:
¡UH oh! Hola mundo - Ya terminé - ¡hora de casa!
lanzable
En PHP 7 vemos la introducción de la interfaz de Throwable
, que implementa tanto el Error
como la Exception
. Esto agrega un nivel de contrato de servicio entre las excepciones en PHP 7 y le permite implementar la interfaz para sus propias excepciones personalizadas:
$handler = function(\Throwable $ex) {
$msg = "[ {$ex->getCode()} ] {$ex->getTraceAsString()}";
mail('[email protected]', $ex->getMessage(), $msg);
echo myNiceErrorMessageFunction();
};
set_exception_handler($handler);
set_error_handler($handler);
Antes de PHP 7, simplemente puede escribir Exception
sugerencia, ya que a partir de PHP 5 todas las clases de excepción lo amplían.
Registro de errores fatales
En PHP, un error fatal es un tipo de error que no se puede detectar, es decir, después de experimentar un error fatal, un programa no se reanuda. Sin embargo, para registrar este error o manejar de alguna manera el bloqueo, puede usar register_shutdown_function
para registrar el controlador de apagado.
function fatalErrorHandler() { // Let's get last error that was fatal. $error = error_get_last(); // This is error-only handler for example purposes; no error means that // there were no error and shutdown was proper. Also ensure it will handle // only fatal errors. if (null === $error || E_ERROR != $error['type']) { return; } // Log last error to a log file. // let's naively assume that logs are in the folder inside the app folder. $logFile = fopen("./app/logs/error.log", "a+"); // Get useful info out of error. $type = $error["type"]; $file = $error["file"]; $line = $error["line"]; $message = $error["message"] fprintf( $logFile, "[%s] %s: %s in %s:%d\n", date("Y-m-d H:i:s"), $type, $message, $file, $line); fclose($logFile); } register_shutdown_function('fatalErrorHandler');
Referencia:
- http://php.net/manual/en/function.register-shutdown-function.php
- http://php.net/manual/en/function.error-get-last.php
- http://php.net/manual/en/errorfunc.constants.php