Manejo de Excepciones y Control de Errores en la Base de Datos
Al ejecutar procedimientos almacenados y triggers en entornos de producción, pueden ocurrir fallos imprevistos: violaciones de unicidad (UNIQUE), restricciones de clave foránea no satisfechas, divisiones por cero o incumplimiento de reglas de negocio críticas.
Un código procedural robusto debe ser capaz de capturar las excepciones, registrar los fallos en tablas de auditoría, revertir transacciones de forma controlada y lanzar mensajes de error claros y personalizados a las aplicaciones clientes.
1. Captura y Manejo Estructurado de Errores #
Cada motor relacional implementa su propia sintaxis para interceptar excepciones sin que el servidor aborte bruscamente la conexión:
1┌────────────────────────────────────────────────────────┐ 2│ BLOQUE PRINCIPAL (Intentar operaciones SQL) │ 3│ - Descontar saldo │ 4│ - Registrar factura │ 5└──────────────────────────┬─────────────────────────────┘ 6 │ ¿Ocurre un error o violación? 7 ┌──────────────┴──────────────┐ 8 ▼ Sí ▼ No 9┌──────────────────────────────┐ ┌──────────────────────┐ 10│ BLOQUE DE EXCEPCIÓN / CATCH │ │ Confirmar (COMMIT) │ 11│ - Registrar en log_errores │ └──────────────────────┘ 12│ - ROLLBACK seguro │ 13│ - Notificar al cliente │ 14└──────────────────────────────┘
2. Ejemplos de Implementación Multi-Motor #
3. Señalización de Errores de Dominio (RAISE / SIGNAL / THROW) #
| Motor | Sentencia para lanzar excepción personalizada | Código / Estado estándar |
|---|---|---|
| PostgreSQL | RAISE EXCEPTION 'mensaje' USING ERRCODE = '...'; | Códigos definidos por el usuario (ej. P0001) |
| MySQL | SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '...'; | SQLSTATE '45000' (genérico de usuario) |
| SQL Server | THROW 50000+, 'mensaje', estado; | Códigos |
| Oracle | RAISE_APPLICATION_ERROR(-20000 a -20999, 'mensaje'); | Rango de usuario -20000 a -20999 |
Resumen del tema
Conceptos clave #
- Control de excepciones: mecanismo para capturar errores de base de datos (
UNIQUE,FK, restricciones) y evitar caídas en cascada. - Estructuras:
EXCEPTION WHEN(PostgreSQL/Oracle),DECLARE HANDLER(MySQL) yTRY...CATCH(SQL Server). - Señalización:
RAISE EXCEPTION,SIGNALyTHROWpermiten crear mensajes de error semánticos con códigos de estado específicos. - Reversión controlada: asegura que toda transacción con fallos ejecute
ROLLBACKpara preservar la integridad de los datos.
Qué debes recordar #
Siempre envuelve operaciones transaccionales complejas en bloques de captura de errores para garantizar que se ejecute ROLLBACK y la base de datos no quede en un estado inconsistente.