39-exceptiones en PHP




Qué es una excepción?

Una excepción en PHP es un mecanismo que permite detener el flujo normal del programa cuando ocurre un error o un comportamiento inesperado. En lugar de generar un mensaje de error simple, PHP permite "lanzar" una excepción para que pueda ser manejada de manera controlada.

Las excepciones pueden ser generadas automáticamente por PHP o definidas por el usuario dentro de su código. Al usar excepciones, se mejora la estabilidad y seguridad de una aplicación, ya que se evita que los errores pasen desapercibidos y afecten otras partes del sistema.

¿Cuándo se utilizan excepciones?

  • ✔️ Cuando una operación no puede completarse correctamente (por ejemplo, un archivo no encontrado o una conexión fallida).
  • ✔️ Para validar datos en formularios o consultas a la base de datos.
  • ✔️ Cuando una función recibe parámetros incorrectos y necesita detenerse.

Ejemplo básico de una excepción en PHP


    <?php
    function dividir($a, $b) {
        if ($b == 0) {
            throw new Exception("Error: No se puede dividir por cero.");
        }
        return $a / $b;
    }
    
    try {
        echo dividir(10, 2); // Funciona correctamente
        echo dividir(5, 0);  // Genera una excepción
    } catch (Exception $e) {
        echo "Excepción capturada: " . $e->getMessage();
    }
    ?>
        



Lanzando una excepción

En PHP, la declaración throw permite que una función o método genere una excepción cuando ocurre un error. Al lanzar una excepción, la ejecución del código se detiene inmediatamente y el flujo del programa cambia a la sección que maneja la excepción.

Si una excepción no es atrapada, PHP generará un error fatal con un mensaje indicando que la excepción no fue manejada.

Ejemplo: Lanzar una excepción sin capturarla

El siguiente código intenta dividir un número, pero si el divisor es 0, se lanza una excepción:


    <?php
    function dividir($dividendo, $divisor) {
        if ($divisor == 0) {
            throw new Exception("Error: División por cero");
        }
        return $dividendo / $divisor;
    }
    
    // Intentamos dividir por cero sin capturar la excepción
    echo dividir(5, 0);
    ?>
        

Resultado esperado

Como la excepción no es manejada, PHP generará un error fatal similar al siguiente:


    Fatal error: Uncaught Exception: Error: División por cero in C:\webfolder\test.php:4
    Stack trace: #0 C:\webfolder\test.php(9): dividir(5, 0)
    #1 {main} thrown in C:\webfolder\test.php on line 4
        



La declaración de captura de intento

Para evitar errores fatales cuando se lanza una excepción, PHP proporciona la estructura try...catch. Este mecanismo permite capturar excepciones y manejar los errores sin interrumpir completamente la ejecución del programa.

Sintaxis básica de try...catch


    try {
        // Código que puede generar una excepción
    } catch (Exception $e) {
        // Código que se ejecuta si se captura una excepción
    }
        

Ejemplo: Capturar una excepción

En el siguiente código, intentamos dividir un número, pero si el divisor es 0, se lanza una excepción. En este caso, el error se captura y se muestra un mensaje personalizado en lugar de un error fatal:


    <?php
    function dividir($dividendo, $divisor) {
        if ($divisor == 0) {
            throw new Exception("Error: División por cero");
        }
        return $dividendo / $divisor;
    }
    
    try {
        echo dividir(5, 0);
    } catch (Exception $e) {
        echo "No es posible realizar la división.";
    }
    ?>
        

Explicación

  • 📌 El bloque try contiene el código que podría lanzar una excepción.
  • 📌 Si se lanza una excepción, el programa busca un bloque catch adecuado.
  • 📌 El bloque catch captura la excepción y ejecuta el código dentro de él.
  • 📌 En este caso, en lugar de un error fatal, el mensaje "No es posible realizar la división." se muestra al usuario.



El intento... captura... finalmente Declaración

La estructura try...catch...finally permite manejar excepciones y ejecutar un bloque de código sin importar si se capturó una excepción o no. El bloque finally siempre se ejecutará, lo que lo hace útil para realizar tareas de limpieza como cerrar conexiones a bases de datos o liberar recursos.

Sintaxis de try...catch...finally


    try {
        // Código que puede generar una excepción
    } catch (Exception $e) {
        // Código que se ejecuta si se captura una excepción
    } finally {
        // Código que siempre se ejecuta, haya o no una excepción
    }
        

Ejemplo 1: Capturar una excepción y ejecutar un mensaje final

En este ejemplo, si la división por cero ocurre, el bloque catch manejará la excepción y el bloque finally se ejecutará de todos modos.


    <?php
    function dividir($dividendo, $divisor) {
        if ($divisor == 0) {
            throw new Exception("Error: División por cero");
        }
        return $dividendo / $divisor;
    }
    
    try {
        echo dividir(5, 0);
    } catch (Exception $e) {
        echo "No es posible realizar la división. ";
    } finally {
        echo "Proceso finalizado.";
    }
    ?>
        

Resultado esperado


    No es posible realizar la división. Proceso finalizado.
        

Ejemplo 2: Usar finally sin catch

En este caso, aunque no se use catch, el bloque finally se ejecuta siempre.


    <?php
    function dividir($dividendo, $divisor) {
        if ($divisor == 0) {
            throw new Exception("Error: División por cero");
        }
        return $dividendo / $divisor;
    }
    
    try {
        echo dividir(5, 0);
    } finally {
        echo "Proceso finalizado.";
    }
    ?>
        

Resultado esperado


    Fatal error: Uncaught Exception: Error: División por cero...
    Proceso finalizado.
        

Explicación

  • 📌 El bloque finally se ejecuta siempre, sin importar si hubo una excepción o no.
  • 📌 En el primer ejemplo, el error se captura y luego se ejecuta finally.
  • 📌 En el segundo ejemplo, como no hay catch, el programa genera un error fatal pero finally aún se ejecuta.
  • 📌 Esto es útil cuando se necesita liberar recursos sin importar lo que ocurra en el código.



El objeto de excepción

El objeto de excepción contiene información detallada sobre el error o comportamiento inesperado que se produjo en la ejecución del código.

Sintaxis

new Exception(message, code, previous)

Parámetros

Parámetro Descripción
message (Opcional) Una cadena que describe la razón por la cual se lanzó la excepción.
code (Opcional) Un número entero que permite identificar la excepción dentro del mismo tipo.
previous (Opcional) Si la excepción fue lanzada dentro de un bloque catch, se recomienda pasar la excepción anterior en este parámetro.

Métodos del objeto de excepción

Cuando se captura una excepción, se pueden usar los siguientes métodos para obtener información sobre ella:

Método Descripción
getMessage() Devuelve una cadena que describe la razón por la que se lanzó la excepción.
getCode() Devuelve el código de la excepción.
getFile() Devuelve la ruta completa del archivo donde se lanzó la excepción.
getLine() Devuelve el número de línea en la que ocurrió la excepción.
getPrevious() Si la excepción fue provocada por otra, este método devuelve la excepción previa, de lo contrario, devuelve null.

Ejemplo: Obtener información de una excepción

En este ejemplo, una función de división lanza una excepción si el divisor es 0. Luego, el bloque catch captura la excepción y muestra información relevante.


    <?php
    function dividir($dividendo, $divisor) {
        if ($divisor == 0) {
            throw new Exception("Error: División por cero", 1);
        }
        return $dividendo / $divisor;
    }
    
    try {
        echo dividir(5, 0);
    } catch (Exception $ex) {
        $code = $ex->getCode();
        $message = $ex->getMessage();
        $file = $ex->getFile();
        $line = $ex->getLine();
        echo "Excepción lanzada en $file en la línea $line: [Código $code] $message";
    }
    ?>
        

Salida esperada

Excepción lanzada en C:\webfolder\test.php en la línea 4: [Código 1] Error: División por cero

Explicación

  • 📌 Si el divisor es 0, se lanza una excepción con un mensaje y un código.
  • 📌 El bloque catch captura la excepción y usa métodos como getMessage(), getCode(), getFile() y getLine() para mostrar detalles del error.
  • 📌 Esto es útil para depuración y manejo de errores de manera estructurada.



Referencia completa de excepción

Las excepciones en PHP son utilizadas por funciones y métodos para comunicar errores y comportamientos inesperados. Aunque el objeto de excepción no tiene propiedades públicas, sí posee propiedades privadas y protegidas que pueden ser leídas o modificadas mediante su constructor y métodos.

Métodos del objeto de excepción

El objeto Exception proporciona varios métodos útiles para obtener información sobre una excepción:

Método Descripción
Exception() Constructor del objeto Exception.
getCode() Devuelve el código de la excepción.
getFile() Devuelve la ruta completa del archivo donde se lanzó la excepción.
getMessage() Devuelve una cadena con la descripción del motivo de la excepción.
getLine() Devuelve el número de línea en la que se generó la excepción.
getPrevious() Si la excepción fue provocada por otra, devuelve la excepción previa; en caso contrario, devuelve null.
getTrace() Devuelve un array con información sobre las funciones que estaban ejecutándose al momento de la excepción.
getTraceAsString() Devuelve la misma información que getTrace(), pero en formato de cadena.

Ejemplo: Obtener información de una excepción

Este ejemplo muestra cómo capturar una excepción y acceder a sus detalles mediante los métodos del objeto Exception:


    <?php
    function dividir($dividendo, $divisor) {
        if ($divisor == 0) {
            throw new Exception("No se puede dividir por cero", 100);
        }
        return $dividendo / $divisor;
    }
    
    try {
        echo dividir(10, 0);
    } catch (Exception $ex) {
        echo "Mensaje: " . $ex->getMessage() . "<br>";
        echo "Código: " . $ex->getCode() . "<br>";
        echo "Archivo: " . $ex->getFile() . "<br>";
        echo "Línea: " . $ex->getLine() . "<br>";
        echo "Seguimiento de pila: <br>" . $ex->getTraceAsString();
    }
    ?>
        

Salida esperada


    Mensaje: No se puede dividir por cero
    Código: 100
    Archivo: C:\webfolder\test.php
    Línea: 4
    Seguimiento de pila:
    #0 C:\webfolder\test.php(9): dividir(10, 0)
    #1 {main}
        

Explicación

  • 📌 Si el divisor es 0, se lanza una excepción con un mensaje y un código.
  • 📌 El bloque catch captura la excepción y usa métodos como getMessage(), getCode(), getFile(), getLine() y getTraceAsString() para mostrar información detallada.
  • 📌 Esto permite una mejor depuración y manejo de errores en PHP.

Publicar un comentario

0 Comentarios