Try Catch: Manejo de errores y excepciones
¿Qué es un error o una excepción en PHP?
Un error es un resultado inesperado del programa que el programa no puede manejar.
Los errores se resuelven arreglando el programa. Un ejemplo de error sería un bucle infinito que nunca deja de ejecutarse.
Una excepción es el resultado inesperado del programa que puede ser manejado por el propio programa.
Los ejemplos de excepción incluyen intentar abrir un archivo que no existe.
Esta excepción se puede manejar creando el archivo o presentando al usuario la opción de buscar el archivo.
En este tutorial, aprenderás
- ¿Por qué manejar la excepción?
- Manejo de errores PHP
- Ejemplos de manejo de errores
- Diferencia entre errores y excepciones
- Múltiples excepciones
- Probar el código
¿Por qué manejar la excepción?
- Evite resultados inesperados en nuestras páginas que pueden ser muy molestos o irritantes para nuestros usuarios finales
- Mejore la seguridad de nuestras aplicaciones al no exponer información que los usuarios malintencionados pueden usar para atacar nuestras aplicaciones
- Las excepciones de PHP se utilizan para cambiar el flujo normal de un programa si se produce algún error predecible.
Manejo de errores PHP
Cuando se produce un error, dependiendo de la configuración, PHP muestra el mensaje de error en el navegador web con información relacionada con el error ocurrido.
PHP ofrece varias formas de manejar errores.
Vamos a ver tres (3) métodos de uso común;
die(): la función die() combina la función echo y exit en una. Es muy útil cuando queremos enviar un mensaje y detener la ejecución del script cuando ocurre un error.
Controladores de errores personalizados : estas son funciones definidas por el usuario a las que se llama cada vez que se produce un error.
Informe de errores de PHP : el mensaje de error depende de la configuración de informe de errores de PHP. Este método es muy útil en el entorno de desarrollo cuando no tiene idea de qué causó el error. La información que se muestra puede ayudarlo a depurar su aplicación.
Ejemplos de manejo de errores
Veamos ahora algunos ejemplos simples con rutinas de manejo de errores.
Supongamos que hemos desarrollado una aplicación que utiliza archivos de texto para almacenar datos. Es posible que deseemos verificar la existencia del archivo antes de intentar leer datos de él.
El siguiente código implementa el ejemplo anterior.
<?php $denominador = 0; echo 2 / $denominador; ?>
Suponiendo que guardó el archivo simple_error.php en la carpeta phptuts, abra la URL http: //localhost/phptut/simple_error.php
Obtendrás el siguiente error:
Warning: Division by zero in ...
Como puede ver en los resultados anteriores, hace que nuestra aplicación parezca poco profesional y puede ser molesta para el usuario.
Modificaremos el código anterior y escribiremos un controlador de errores para la aplicación.
<?php $denominador = 0; if($denominador! = 0) { echo 2 / $denominador; } else { echo "no se puede dividir por cero (0)"; } ?>
Suponiendo que guardó el código anterior como error_handling.php, abra la URL http: //localhost/phptut/error_handling.php
no se puede dividir por cero (0)
Nota: es una buena práctica de seguridad mostrar un mensaje como el que se muestra arriba en lugar de mostrar el mensaje como «Archivo no encontrado».
Veamos otro ejemplo que usa un controlador de errores personalizado.
El controlador de errores personalizado se configurará como la función predeterminada de manejo de errores de PHP y básicamente mostrará un número de error y un mensaje.
El siguiente código ilustra la implementación del ejemplo anterior.
<?php function my_error_handler($error_no, $error_msg) { echo "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
Abra la URL http: //localhost/phptut/custom_error_handler.php obtendrá los siguientes resultados:
Opps, something went wrong: Erron number: [2] Error Description: [Division by zero]
.
Como puede ver en el ejemplo anterior, los controladores de errores personalizados son potentes en el sentido de que
Nos permiten personalizar los mensajes de error.
El controlador de errores personalizado también puede incluir el registro de errores en un archivo / base de datos, enviar un correo electrónico al desarrollador, etc.
Veamos ahora el tercer tipo de manejo de errores. Utilizaremos la función incorporada PHP error_reporting. Tiene la siguiente sintaxis básica
<?php error_reporting($reporting_level); ?>
«error_reporting()» es la función de informe de errores de PHP
«$reporting_level» es opcional, se puede usar para establecer el nivel de informes. Si no se ha especificado ningún nivel de informes, PHP utilizará el nivel de informe de errores predeterminado como se especifica en el archivo php.ini.
Descripción |
Ejemplo |
---|---|
E_WARNINGMuestra solo mensajes de advertencia. No detiene la ejecución del script |
error_reporting (E_WARNING ); |
E_NOTICEMuestra avisos que pueden ocurrir durante la ejecución normal de un programa o podrían ser un error. |
error_reporting (E_NOTICE ); |
E_USER_ERRORMuestra los errores generados por el usuario, es decir, el controlador de errores personalizado |
error_reporting (E_USER_ERROR ); |
E_USER_WARNINGMuestra mensajes de advertencia generados por el usuario. |
error_reporting (E_USER_WARNING); |
E_USER_NOTICEMuestra avisos generados por el usuario |
error_reporting (E_USER_NOTICE); |
E_RECOVERABLE_ERRORMuestra los errores que no son fatales y se pueden manejar con manejadores de errores personalizados |
error_reporting (E_RECOVERABLE_ERROR); |
E_ALLMuestra todos los errores y advertencias. |
error_reporting (E_ ALL); |
Diferencia entre errores y excepciones
Se lanzan excepciones y se pretenden atrapar, mientras que los errores generalmente son irrecuperables.
Las excepciones se manejan de forma orientada a objetos.
Esto significa cuando se lanza una excepción; Se crea un objeto de excepción que contiene los detalles de la excepción.
La siguiente tabla muestra los métodos de objetos de excepción.
Método /
Descripción |
Ejemplo |
getMessage()Muestra el mensaje de la excepción. |
echo $e->getMessage(); |
getCode()Muestra el código numérico que representa la excepción. |
echo $e->getCode(); |
getFile()Muestra el nombre del archivo y la ruta donde ocurrió la excepción |
echo $e->getFile(); |
getLine()Muestra el número de línea donde ocurrió la excepción. |
echo $e->getLine(); |
getTrace()Muestra un array de la traza inversa antes de la excepción. |
print_r($ e->getTrace()); |
getPrevious()Muestra la excepción anterior antes de la actual. |
echo $e->getPrevious(); |
getTraceAsString ()Muestra la traza inversa de la excepción como una cadena en lugar de un array
|
echo $e->getTraceAsString(); |
__toString()Muestra la excepción completa como una cadena. |
echo $e -> __ toString(); |
A continuación se muestra la sintaxis básica para lanzar una excepción.
<?php throw new Exception("Este es un ejemplo de excepción"); ?>
AQUÍ,
«throw» es la palabra clave utilizada para lanzar la excepción
«new Exception (…)» crea un objeto de excepción y pasa la cadena «Este es un ejemplo de excepción» como parámetro del mensaje.
El código anterior genera el siguiente mensaje.
Ahora veremos un ejemplo que implementa las excepciones de try y catch.
Modificaremos el ejemplo anterior e incluiremos el try, throw and catch.
Tiene la siguiente sintaxis básica.
<?php try{ // el código va aquí que podría generar una excepción } catch(Excepción $e) { // el código de manejo de excepciones va aquí } ?>
AQUÍ,
«try {…}» es el bloque de código a ejecutar que podría generar una excepción
«catch (Exception $e) {…}» es el bloque de código que captura la excepción lanzada y asigna el objeto de excepción a la variable $e.
El siguiente código muestra el ejemplo básico de excepción con la excepción try, throw and catch implementada.
El programa arroja deliberadamente una excepción que luego atrapa.
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
Abra la URL http: //localhost/phptut/exception_handling.php Obtendrá los siguientes resultados.
También es posible crear múltiples excepciones para una declaración de prueba de php dependiendo del tipo de excepción lanzada.
Vea el artículo sobre MySQL, acceso a datos PHP … para ejemplos de implementación de múltiples excepciones
Múltiples excepciones
Las excepciones múltiples usan múltiples bloques catch para tratar las excepciones lanzadas. Múltiples excepciones son útiles cuando;
- Desea mostrar un mensaje personalizado dependiendo de la excepción lanzada
- Desea realizar una operación única dependiendo de la excepción lanzada
El diagrama de flujo a continuación ilustra cómo funcionan las excepciones múltiples
Veamos un ejemplo que usa múltiples excepciones.
Modificaremos el código que divide un número por el denominador aprobado.
Esperamos que ocurran dos tipos de excepciones;
- División por cero
- División por un número negativo
En aras de la simplicidad, solo mostraremos el tipo de excepción en nuestros bloques catch.
El PHP integrado en la clase Exception se usa para lanzar excepciones.
Crearemos dos clases que amplíen la clase de excepción y las usaremos para lanzar excepciones.
El siguiente código muestra la implementación.
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
Probar el código
Asumiremos que guardó multiple_exceptions.php en la carpeta phptuts.
Navegue a la URL http: //localhost/phptut/multiple_exceptions.php
DIVIDE BY ZERO EXCEPTION!
Vuelva al archivo PHP y pase -1 como parámetro .
Vaya a la URL http: //localhost/phptut/multiple_exceptions.php .
¿Qué resultados obtienes?
Pase 3 como parámetro.
¿Qué resultados obtienes?
Resumen
Los errores son resultados inesperados producidos por el código PHP
El manejo de errores mejora el rendimiento de la aplicación
PHP ha incorporado funciones que pueden usarse para personalizar la forma en que PHP informa errores
Las excepciones son como errores, pero se pueden detectar utilizando el bloque catch cuando se lanzan.
Mostrar mensajes de error que muestran información de error se considera una mala práctica de seguridad.