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 perofinally
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 comogetMessage()
,getCode()
,getFile()
ygetLine()
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 comogetMessage()
,getCode()
,getFile()
,getLine()
ygetTraceAsString()
para mostrar información detallada. - 📌 Esto permite una mejor depuración y manejo de errores en PHP.
0 Comentarios
Si desea contactar comigo, lo puede hacer atravez deste formulario gracias