Las excepciones en PHP son eventos anómalos o errores que ocurren durante la ejecución de un programa. A diferencia de los errores tradicionales, las excepciones permiten manejar situaciones problemáticas de manera estructurada y elegante, sin interrumpir abruptamente la ejecución del programa.
El bloque try-catch es la estructura básica para el manejo de excepciones en PHP. Consiste en:
<?php
try {
// Código que podría generar una excepción
$numero = 10;
$division = $numero / 0; // Esto causará una excepción de división por cero
echo "Este código no se ejecutará si hay una excepción";
} catch (DivisionByZeroError $e) {
// Manejo de la excepción
echo "Error: " . $e->getMessage();
// getMessage() devuelve el mensaje de error asociado con la excepción
}
?>
En este ejemplo, intentamos dividir un número por cero, lo que causará una excepción. El bloque try-catch nos permite manejar esta situación de forma elegante, mostrando un mensaje de error en lugar de romper la ejecución del programa.
Excepción | Descripción | Ejemplo de Uso |
---|---|---|
Exception |
Clase base para todas las excepciones | Capturar cualquier tipo de excepción |
Error |
Errores internos de PHP que normalmente no deberían ser capturados | Errores fatales, desbordamiento de memoria |
TypeError |
Error de tipo de datos | Pasar string donde se espera un número |
ValueError |
Valor inválido para la operación | Argumentos fuera de rango |
DivisionByZeroError |
División por cero | Operaciones matemáticas inválidas |
<?php
function checkNumber($number) {
if (!is_numeric($number)) {
throw new TypeError("Se esperaba un número");
}
if ($number <= 0) {
throw new Exception("El número debe ser positivo");
}
return sqrt($number);
}
try {
echo checkNumber("abc"); // Esto causará TypeError
// echo checkNumber(-5); // Esto causará Exception
// echo checkNumber(16); // Esto retornaría 4
} catch (TypeError $e) {
echo "Error de tipo: " . $e->getMessage() . "<br>";
} catch (Exception $e) {
echo "Excepción general: " . $e->getMessage() . "<br>";
}
?>
Al usar múltiples bloques catch, ordénalos de más específico a más general. Si pones Exception primero, capturará todas las excepciones y los bloques posteriores nunca se ejecutarán.
El bloque finally se ejecuta siempre, independientemente de si se produce una excepción o no. Es útil para tareas de limpieza como cerrar conexiones o archivos.
<?php
function procesarArchivo($rutaArchivo) {
$archivo = null;
try {
$archivo = fopen($rutaArchivo, 'r');
if (!$archivo) {
throw new Exception("No se pudo abrir el archivo");
}
// Procesar el archivo...
while (!feof($archivo)) {
$linea = fgets($archivo);
echo $linea;
}
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
} finally {
// Cerrar el archivo si está abierto
if ($archivo) {
fclose($archivo);
echo "<br>Archivo cerrado correctamente";
}
}
}
procesarArchivo('archivo_inexistente.txt');
?>