Ejemplo de PHP Try Catch: Tutorial de manejo de errores y excepciones

ยฟQuรฉ es una excepciรณn?

Un error es un resultado inesperado del programa que el programa mismo 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.

Ejemplos de excepciรณn incluyen intentar abrir un archivo que no existe.

Esta excepciรณn se puede manejar creando el archivo o presentรกndole al usuario una opciรณn para buscar el archivo.

ยฟPor quรฉ manejar la excepciรณn?

  • Evitar resultados inesperados en nuestras pรกginas que pueden resultar muy molestos o irritantes para nuestros usuarios finales.
  • Mejorar la seguridad de nuestras aplicaciones al no exponer informaciรณn que usuarios malintencionados puedan utilizar para atacar nuestras aplicaciones.
  • Las excepciones de PHP se utilizan para cambiar el flujo normal de un programa si ocurre algรบn error predecible.

Manejo de errores de PHP

Cuando ocurre un error, dependiendo de sus ajustes de 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 comรบnmente utilizados;

  1. Morir declaracionesโ€“ la funciรณn de troquel combina la funciรณn de eco y de salida en una. Es muy รบtil cuando queremos generar un mensaje y detener la ejecuciรณn del script cuando ocurre un error.
  2. Manejadores de errores personalizados โ€“ estas son funciones definidas por el usuario que se llaman cada vez que ocurre un error.
  3. Informe de errores de PHP โ€“ el mensaje de error depende de la configuraciรณn de informes de errores de PHP. Este mรฉtodo es muy รบtil en entornos de desarrollo cuando no se 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 sencillos con rutinas de manejo de errores.

Supongamos que hemos desarrollado una aplicaciรณn que utiliza archivos de texto para almacenar datos. Es posible que queramos comprobar la existencia del archivo antes de intentar leer datos del mismo.

El siguiente cรณdigo implementa el ejemplo anterior.

<?php
$denominator = 0;
echo 2 / $denominator;
?>

Suponiendo que guardรณ el archivo simple_error.php en la carpeta phptuts, abra el URL http://localhost/phptuts/simple_error.php

Obtendrรกs los siguientes resultados

Manejo de errores de PHP

Como puede ver en los resultados anteriores, hace que nuestra aplicaciรณn parezca poco profesional y puede resultar molesta para el usuario.

Modificaremos el cรณdigo anterior y escribiremos un controlador de errores para la aplicaciรณn.

<?php
$denominator = 0;
if ($denominator != 0) {
    echo 2 / $denominator;
} else {
    echo "cannot divide by zero (0)";
}
?>

Suponiendo que guardรณ el cรณdigo anterior como error_handling.php, abra el URL http://localhost/phptuts/error_handling.php

Manejo de excepciones de PHP en PHP

Nota: Es una buena prรกctica de seguridad mostrar un mensaje como el que se muestra arriba en lugar de mostrar un mensaje como "Archivo no encontrado".

Veamos otro ejemplo que utiliza un controlador de errores personalizado.

El controlador de errores personalizado se configurarรก como la funciรณn de manejo de errores de PHP predeterminada 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 el panel de URL http://localhost/phptuts/custom_error_handler.php Obtendrรกs los siguientes resultados

. Manejo de errores de PHP


Como puede ver en el ejemplo anterior, los controladores de errores personalizados son poderosos 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, el envรญo de correos electrรณnicos al desarrollador, etc.

Ahora veamos el tercer tipo de manejo de errores. Usaremos la funciรณn incorporada de PHP error_reporting. Tiene la siguiente sintaxis bรกsica

<?php
error_reporting($reporting_level);
?>

AQUร,

  • โ€œerror_reportingโ€ es la funciรณn de informe de errores de PHP
  • โ€œ$reporting_levelโ€ es opcional y se puede utilizar para establecer el nivel de informes. Si no se ha especificado ningรบn nivel de informe, PHP utilizarรก el nivel de informe de errores predeterminado como se especifica en el archivo php.ini.
Nivel de informes Descripciรณn Ejemplo
E_WARNING Muestra sรณlo mensajes de advertencia. No detiene la ejecuciรณn del script. informe_error(E_WARNING);
E_NOTICE Muestra avisos que pueden ocurrir durante la ejecuciรณn normal de un programa o que podrรญan ser un error. error_reporting(E_ AVISO);
E_USER_ERROR Muestra errores generados por el usuario, es decir, un controlador de errores personalizado informe_error(E_USER_ERROR);
E_USER_WARNING Muestra mensajes de advertencia generados por el usuario. informe_error(E_USER_WARNING);
E_USER_NOTICE Muestra avisos generados por el usuario. informe_error(E_USER_NOTICE);
E_RECOVERABLE_ERROR Muestra errores que no son fatales y se pueden manejar mediante controladores de errores personalizados. informe_error(E_RECOVERABLE_ERROR);
E_ALL Muestra todos los errores y advertencias. informe_error(E_ TODOS);

Diferencia entre errores y excepciรณn

  • Las excepciones se lanzan y se pretende detectar, mientras que los errores generalmente son irrecuperables.
  • Las excepciones se manejan de forma orientada a objetos. Esto significa que 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 del objeto de excepciรณn.

Mรฉtodo Descripciรณn Ejemplo
getMessage () Muestra el mensaje de la excepciรณn.
<?php
echo $e->getMessage();
?>
getCode() Muestra el cรณdigo numรฉrico que representa la excepciรณn.
<?php
echo $e->getCode();
?>
Obtener el archivo() Muestra el nombre del archivo y la ruta donde ocurriรณ la excepciรณn.
<?php
echo $e->getFile();
?>
obtener lรญnea() Muestra el nรบmero de lรญnea donde ocurriรณ la excepciรณn.
<?php
echo $e->getLine();
?>
getTracmi() Muestra una serie de la parte posteriortrace antes de la excepciรณn
<?php
print_r( $e->getTrace());
?>
obtenerAnterior() Muestra la excepciรณn anterior antes de la actual.
<?php
echo $e->getPrevious();
?>
getTraceAsString() Muestra la parte traseratrace de la excepciรณn como una cadena en lugar de una matriz
<?php
echo $e->getTraceAsString();
?>
__Encadenar() Muestra la excepciรณn completa como una cadena.
<?php
echo $e->__toString();
?>


A continuaciรณn se muestra la sintaxis bรกsica para lanzar una excepciรณn.

<?php
throw new Exception("This is an exception example");
?>

AQUร,

  • "lanzar" es la palabra clave utilizada para lanzar la excepciรณn
  • "nueva excepciรณn (...)" 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.

Manejo de excepciones de PHP en PHP

Ahora veremos un ejemplo que implementa las excepciones de lanzamiento y captura.

Modificaremos el ejemplo anterior e incluiremos intentar, lanzar y atrapar.

Tiene la siguiente sintaxis bรกsica.

<?php
try {
    //code goes here that could potentially throw an exception
}
catch (Exception $e) {
    //exception handling code goes here
}
?>

AQUร,

  • "try{...}" es el bloque de cรณdigo que se ejecutarรก y que potencialmente podrรญa generar una excepciรณn
  • โ€œcatch(Exception $e){โ€ฆ}โ€ es el bloque de cรณdigo que detecta la excepciรณn lanzada y asigna el objeto de excepciรณn a la variable $e.

El siguiente cรณdigo muestra el ejemplo de excepciรณn bรกsica con la excepciรณn try, throw y catch implementada.

El programa lanza deliberadamente una excepciรณn que luego detecta.

<?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 el panel de URL http://localhost/phptuts/exception_handling.php Obtendrรกs los siguientes resultados.

Manejo de excepciones de PHP en PHP

Tambiรฉn es posible crear mรบltiples excepciones para una declaraciรณn try de php dependiendo del tipo de excepciรณn lanzada.

Ver 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 utilizan mรบltiples bloques try catch para manejar las excepciones lanzadas. Las excepciones mรบltiples son รบtiles cuando:

  • Quiere mostrar un mensaje personalizado segรบn la excepciรณn lanzada
  • Quiere realizar una operaciรณn รบnica en funciรณn de la excepciรณn lanzada

El siguiente diagrama de flujo ilustra cรณmo funcionan las excepciones mรบltiples.

Mรบltiples excepciones

Veamos un ejemplo que utiliza mรบltiples excepciones.

Modificaremos el cรณdigo que divide un nรบmero por el denominador pasado.

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.

La clase PHP integrada Exception se utiliza para generar excepciones.

Crearemos dos clases que extiendan la clase de excepciรณn y las usaremos para generar 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);
?>

Probando el cรณdigo

Asumiremos que guardรณ multiple_exceptions.php en la carpeta phptuts.

Navega hasta el URL http://localhost/phptuts/multiple_exceptions.php

Manejo de excepciones de PHP en PHP

Regrese al archivo PHP y pase -1 como parรกmetro como se muestra en el siguiente diagrama.

Manejo de excepciones de PHP en PHP

Navega hasta el URL http://localhost/phptuts/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 tiene funciones integradas que se pueden usar para personalizar la forma en que PHP informa errores
  • Las excepciones son como errores, pero se pueden detectar usando el bloque catch cuando se lanzan.
  • Mostrar mensajes de error que muestran informaciรณn de error se considera una mala prรกctica de seguridad.

Resumir este post con: