Advertisement
  1. Code
  2. PHP

Excepciones de PHP: Try Catch para el manejo de errores

Scroll to top
Read Time: 9 min

Spanish (Español) translation by Ana Paulina Figueroa (you can also view the original English article)

En esta publicación aprenderás cómo usar el manejo de excepciones en PHP. A partir de PHP 5 podemos usar bloques try catch para gestionar errores; esta es una mejor manera de manejar las excepciones y controlar el flujo de tu aplicación. En este artículo analizaremos los aspectos básicos del manejo de excepciones junto con un par de ejemplos reales.

¿Qué es una excepción?

PHP 5 introdujo un nuevo modelo de errores que te permite lanzar y capturar excepciones en tu aplicación; esta es una mejor manera de gestionar errores en comparación con lo que teníamos en versiones anteriores de PHP. Todas las excepciones son instancias de la clase base Exception, que podemos extender para introducir nuestras propias excepciones personalizadas.

Es importante tomar en cuenta aquí que el manejo de excepciones es diferente al manejo de errores. En el manejo de errores podemos usar la función set_error_handler para establecer nuestras funciones de gestión de errores personalizadas, de manera que cada vez que se desencadene un error, éste invocará a nuestra función de manejo de errores personalizada. De esa manera puedes controlar los errores. Sin embargo, por lo general es imposible recuperarse de ciertos tipos de errores y esto detiene la ejecución del programa.

Por otro lado, las excepciones son algo que es lanzado deliberadamente por el código, y se espera que sean capturadas en algún punto en tu aplicación. Así que podemos decir que es posible recuperarnos de las excepciones, a diferencia de ciertos errores de los que es imposible recuperarse. Si una excepción lanzada se captura en algún lugar de tu aplicación, la ejecución del programa continúa desde el punto en el que la excepción fue capturada. Y una excepción que no es capturada en ningún lugar de tu aplicación da como resultado un error, deteniendo de esa manera la ejecución del programa.

Flujo de control para el manejo de excepciones

Consultemos el siguiente diagrama que muestra el flujo de control genérico para el manejo de excepciones.

Exception handling in a try catch finally blockException handling in a try catch finally blockException handling in a try catch finally block

Las excepciones pueden ser lanzadas y capturadas usando los bloques try and catch. Tú eres el responsable de lanzar las excepciones cuando algo inesperado ocurra. Analicemos rápidamente el flujo básico para el manejo de excepciones como se muestra en el siguiente pseudocódigo.

1
// code before the try-catch block

2
3
try {
4
  // code

5
6
  // if something is not as expected

7
      // throw exception using the "throw" keyword

8
9
  // code, it won't be executed if the above exception is thrown

10
} catch (Exception $e) {
11
  // exception is raised and it'll be handled here

12
  // $e->getMessage() contains the error message

13
}
14
15
// code after the try-catch block, will always be executed

La mayoría de las veces, cuando estés trabajando con excepciones terminarás usando un patrón como el que se muestra en el fragmento de código anterior. También puedes usar el bloque finally junto con los bloques try y catch, pero volveremos a eso más adelante en este artículo.

El bloque try es el que debes usar cuando sospeches que tu código pueda generar una excepción. Siempre debes rodear un código así mediante el uso de try y catch.

Lanzando una excepción

Una excepción puede ser lanzada por una función que invoques, o puedes usar la palabra clave throw para lanzar una excepción manualmente. Por ejemplo, puedes validar alguna entrada antes de llevar a cabo cualquier operación y lanzar una excepción si los datos no son válidos.

Es importante tomar en cuenta aquí que si lanzas una excepción pero no has definido el bloque catch, que se supone debe gestionar la excepción, esto ocasionará un error fatal. Por lo tanto debes asegurarte de definir siempre el bloque catch si estás lanzando excepciones en tu aplicación.

Una vez que una excepción es atrapada en el bloque catch, el objeto Exception contiene el mensaje de error que fue lanzado usando la palabra clave throw. La variable $e del ejemplo anterior es una instancia de la clase Exception, por lo que tiene acceso a todos los métodos de esa clase. En este bloque debes definir tu propia lógica para el manejo de excepciones, es decir, qué es lo que quieres hacer exactamente con el error que atrapaste.

En la siguiente sección revisaremos un ejemplo real para comprender cómo funciona el manejo de excepciones.

Un ejemplo real

En esta sección crearemos un ejemplo real para demostrar el manejo de excepciones en PHP.

Vamos a asumir que has construido una aplicación que carga su configuración del archivo config.php. Ahora bien, es esencial que el archivo config.php esté presente cuando tu aplicación sea ejecutada. Por lo tanto, tu aplicación no puede ejecutarse si el archivo config.php no está presente. Así que este es el perfecto caso de uso para lanzar una excepción e indicar al usuario que debe resolver el problema.

1
<?php
2
try {
3
    // init bootstrapping phase

4
5
    $config_file_path = "config.php";
6
7
    if (!file_exists($config_file_path))
8
    {
9
      throw new Exception("Configuration file not found.");
10
    }
11
 
12
    // continue execution of the bootstrapping phase

13
} catch (Exception $e) {
14
    echo $e->getMessage();
15
    die();
16
}
17
?>

Como puedes ver en el ejemplo anterior, estamos verificando si el archivo config.php existe al principio de la fase de arranque. Si el archivo config.php está presente, la ejecución continúa normalmente. Por otro lado, lanzaremos una excepción si el archivo config.php no existe. Además ¡queremos detener la ejecución también en caso de que ocurra una excepción!.

Así es como puedes usar excepciones en tus aplicaciones. Deberías lanzar excepciones para los casos de uso que sean excepcionales - no deberías lanzar excepciones de forma innecesaria para errores genéricos que esperas que ocurran frecuentemente, como credenciales de usuario no válidas, permisos de directorios incorrectos, etc. Es mejor gestionar estos últimos usando mensajes de error genéricos en el flujo de ejecución regular de la aplicación.

Así que ese fue un ejemplo sobre cómo manejar excepciones usando la clase predeterminada Exception. En la siguiente sección veremos cómo puedes extender la clase base Exception y crear tus propias excepciones personalizadas en tu aplicación.

Cómo crear excepciones personalizadas

En esta sección discutiremos cómo puedes crear excepciones personalizadas en tus aplicaciones. De hecho, extenderemos el ejemplo que acabamos de discutir en la sección anterior para demostrar las excepciones personalizadas.

En el ejemplo anterior, lanzamos la excepción de configuración usando la clase predeterminada Exception. Eso está perfectamente bien, siempre y cuando quieras lidiar solamente con el mensaje de error de la excepción. Sin embargo, algunas veces quieres hacer un poco más en base al tipo de excepción que haya sido lanzado. Es ahí cuando son útiles las excepciones personalizadas.

Vamos a revisar de nuevo el ejemplo anterior, como se muestra en el siguiente fragmento de código.

1
<?php
2
class ConfigFileNotFoundException extends Exception {}
3
4
try {
5
    // init bootstrapping phase

6
7
    $config_file_path = "config.php";
8
9
    if (!file_exists($config_file_path))
10
    {
11
      throw new ConfigFileNotFoundException("Configuration file not found.");
12
    }
13
 
14
    // continue execution of the bootstrapping phase

15
} catch (ConfigFileNotFoundException $e) {
16
    echo "ConfigFileNotFoundException: ".$e->getMessage();
17
    // other additional actions that you want to carry out for this exception

18
    die();
19
} catch (Exception $e) {
20
    echo $e->getMessage();
21
    die();
22
}
23
?>

Primero hemos definido la clase ConfigFileNotFoundException que extiende a la clase Exception predeterminada. Ahora se ha convertido en nuestra clase personalizada para las excepciones y podemos usarla cuando queramos lanzar la excepción ConfigFileNotFoundException en nuestra aplicación.

A continuación hemos usado la palabra clave throw para lanzar la excepción ConfigFileNotFoundException en caso de que el archivo config.php no exista. Sin embargo, la diferencia importante reside en el bloque catch. Como puedes ver, hemos definido dos bloques catch, y cada bloque se usa para capturar los diferentes tipos de excepciones.

El primero atrapa las excepciones del tipo ConfigFileNotFoundException. Por lo tanto, si una excepción que ha sido lanzada es del tipo ConfigFileNotFoundException, este bloque es el que será ejecutado. Si el tipo de la excepción no coincide con ninguno de los bloques catch específicos, entonces coincidirá con el último que está ahí para capturar todos los mensajes de excepción genéricos.

El bloque finally

En esta sección veremos cómo podemos usar la palabra clave finally junto con los bloques try and catch. Algunas veces quieres ejecutar un fragmento de código independientemente de si se lanzó una excepción o no. Es ahí en donde puedes usar el bloque finally, ya que el código que coloques en dicho bloque siempre será ejecutado después de la ejecución de los bloques try y catch, sin importar si ha sido lanzada una excepción o no.

Intentemos comprender esto usando el siguiente ejemplo.

1
try {
2
  // code

3
4
  // if something is not as expected

5
      // throw exception using the "throw" keyword

6
7
  // code, it won't be executed if the above exception is thrown

8
} catch (Exception $e) {
9
  // exception is raised and it'll be handled here

10
  // $e->getMessage() contains the error message

11
} finally {
12
  // code, it'll always be executed

13
}

El código del ejemplo anterior es básicamente el mismo, con la única diferencia de que hemos añadido el bloque finally después del bloque catch. Y, como hemos discutido, el código de este bloque siempre será ejecutado.

El típico caso de uso que podemos pensar que necesite usar el bloque finally generalmente estará relacionado con la limpieza de recursos. Por ejemplo, si has abierto una conexión a una base de datos o un archivo en el disco en el bloque try, puedes llevar a cabo tareas de limpieza como cerrar la conexión en el bloque finally, ya que es una garantía que será ejecutado.

El manejo de excepciones es una habilidad de codificación fundamental y debes considerar la manera en la que serán gestionadas las excepciones al desarrollar tus aplicaciones. Esto te ayudará a detectar errores inesperados y recuperarte de ellos en tu aplicación. ¡Espero que esta publicación te inspire a escribir código con un mejor manejo de errores!.

Conclusión

Hoy discutimos el tema del manejo de excepciones en PHP. En la primera mitad del artículo discutimos los fundamentos de las excepciones en PHP y creamos un ejemplo real para demostrar su funcionamiento. Al final exploramos cómo puedes crear excepciones personalizadas extendiendo la clase base Exception.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.