Gestión de errores en PHP
Bienvenido a una nueva lección de nuestro curso básico de PHP 8. Hoy nos metemos con la gestión de errores, una habilidad clave para hacer que tus aplicaciones sean robustas y amigables. Los errores son parte del juego, pero si sabes manejarlos, tu código brillará. Si ya manejas arrays y excepciones, esto te va a encantar porque es como ponerle un cinturón de seguridad a tu programa. Todo va a ser claro, práctico y con ejemplos que te van a flipar. ¡Empecemos!
¿Qué es la gestión de errores?
La gestión de errores se trata de identificar, controlar y resolver problemas en tu código para que no rompan tu aplicación ni molesten a los usuarios. En PHP, los errores pueden ser desde un simple descuido en la escritura hasta problemas graves en tiempo de ejecución. La idea es detectarlos rápido, manejarlos con estilo y, si es posible, evitar que aparezcan.
Tipos principales de errores:
- Errores de sintaxis: Fallos en la gramática del código (falta un
;
o un}
). - Errores de excepciones: Problemas en tiempo de ejecución (división por cero, archivo no encontrado).
- Errores lógicos: Cuando el código corre, pero da resultados incorrectos (sumar mal un total).
Probando la gestión de errores en acción
¡Manos a la obra! Crea un archivo errores.php
en curso_php8
(dentro de C:\xampp\htdocs
) y prueba estos ejemplos.
Ejemplo 1: Error de sintaxis
<?php // Error de sintaxis intencional echo "Curso de PHP"; // echo "Versión 8.2"; // Falta el punto y coma ?>
Si ejecutas esto en http://localhost/curso_php8/errores.php
, verás un mensaje como:
Parse error: syntax error, unexpected 'echo' in .../errores.php on line 4
¿Qué pasó?
- Olvidamos el
;
después del primerecho
, y PHP se quejó. - Los errores de sintaxis se detectan antes de ejecutar, así que hay que corregirlos primero.
Corrección:
<?php echo "Curso de PHP"; // ¡Ahora sí! echo "Versión 8.2"; ?>
Ejemplo 2: Excepciones con try-catch
<?php try { $dv = 0; if ($dv == 0) { throw new Exception("No se puede dividir por cero"); } $resultado = 10 / $dv; echo "Resultado: $resultado<br>"; } catch (Exception $e) { echo "Error: " . $e->getMessage() . "<br>"; } ?>
Resultado:
Error: No se puede dividir por cero
¿Qué pasó?
- Intentamos dividir por cero, lo que lanza una excepción con
throw
. - El bloque
catch
atrapó el error y mostró un mensaje claro. - Evitamos que el programa se rompiera.
Ejemplo práctico
Ejemplo: Validación de archivo
<?php try { $archivo = "datos.txt"; if (!file_exists($archivo)) { throw new Exception("El archivo $archivo no existe"); } $contenido = file_get_contents($archivo); echo "Contenido: $contenido<br>"; } catch (Exception $e) { echo "Error: " . $e->getMessage() . "<br>"; } finally { echo "Operación de archivo terminada<br>"; } ?>
Resultado (si datos.txt
no existe):
Error: El archivo datos.txt no existe Operación de archivo terminada
¿Qué pasó?
- Verificamos si el archivo existe; si no, lanzamos una excepción.
catch
mostró el error de forma controlada.finally
se ejecutó para cerrar el proceso, haya o no error.
Configurando el error reporting
PHP te permite controlar qué errores se muestran con error_reporting()
y ini_set()
. Esto es útil para desarrollo (ver todo) y producción (ocultar detalles sensibles).
Ejemplo: Personalizar error reporting
<?php // Mostrar todos los errores (ideal para desarrollo) error_reporting(E_ALL); ini_set('display_errors', 1); // Código con un warning $array = [1, 2, 3]; echo $array[10]; // Índice inexistente ?>
Resultado:
Notice: Undefined offset: 10 in .../errores.php on line 6
¿Qué pasó?
- Activamos todos los errores con
E_ALL
, incluyendo advertencias (E_NOTICE
). - Accedimos a un índice que no existe, y PHP nos avisó.
Para producción:
<?php error_reporting(0); // No mostrar errores ini_set('display_errors', 0); ini_set('log_errors', 1); // Guardar en un log ini_set('error_log', 'errores.log'); // Archivo de log ?>
Esto oculta errores en el navegador y los guarda en un archivo para revisarlos después.
Ejemplo práctico adicional: Error lógico
<?php function calcularPromedio($notas) { $suma = 0; $count = count($notas); if ($count == 0) { return "No hay notas"; } foreach ($notas as $nota) { $suma += $nota; } return $suma / $count; } // Error lógico intencional $notas = [10, 8, 9]; echo "Promedio: " . calcularPromedio($notas) . "<br>"; // Caso vacío $notasVacias = []; echo calcularPromedio($notasVacias) . "<br>"; ?>
Resultado:
Promedio: 9 No hay notas
¿Qué pasó?
- Calculamos el promedio correctamente para
[10, 8, 9]
. - Evitamos un error lógico al validar el caso vacío, retornando un mensaje claro.
Consejos para no enredarte
- Corrige sintaxis primero: Usa un editor con resaltado para detectar puntos y comas o llaves faltantes.
- Usa
try-catch
para excepciones: Ideal para errores en tiempo de ejecución como archivos o conexiones. - Valida la lógica: Antes de operar, verifica condiciones (como divisores o arrays vacíos).
- Ajusta
error_reporting
:- Desarrollo:
E_ALL
para ver todo. - Producción: Oculta errores (
error_reporting(0)
) y usa logs.
- Desarrollo:
- Logs son tus amigos: Guarda errores en un archivo para analizar sin exponerlos.
¡A por más robustez!
¡Gran trabajo, máquina! Ahora la gestión de errores es tu superpoder para crear aplicaciones confiables. En la próxima lección, veremos uso de bases de datos con PHP para almacenar y recuperar datos como pros. Si algo no te queda claro, déjame un comentario o revisa el código en GitHub.
Lo que aprendiste hoy:
- Tipos de errores: Sintaxis, excepciones y lógicos, cada uno con su truco.
try-catch
: Tu red para atrapar excepciones en tiempo de ejecución.- Error reporting: Controlaste qué errores ver y cómo guardarlos.
- Ejemplos vivos: Maneaste sintaxis, divisiones y archivos como crack.
- Tip del pro: Usa logs en producción para proteger tu app y debuguear tranquilo.