Usar una excepción personalizada
Parte de la sección Lógica y Flujo del Journey de PHP de Coddy — lección 57 de 68.
Ahora que has creado tu propia clase de excepción personalizada, es hora de ponerla en uso práctico. El uso de una excepción personalizada implica dos pasos clave: lanzar tu tipo de excepción específico cuando ocurre un problema, y capturar ese tipo de excepción específico para manejarlo adecuadamente.
Cuando lanzas una excepción personalizada, usas la misma palabra clave throw pero creas una instancia de tu clase personalizada en lugar de la clase genérica Exception. Esto hace que tu manejo de errores sea más preciso y significativo.
<?php
class InvalidEmailException extends Exception {}
function validateEmail($email) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidEmailException("Invalid email format: " . $email);
}
echo "Email is valid!";
}
?>El verdadero poder surge al capturar tu excepción personalizada. En lugar de capturar una Exception genérica, puedes capturar tu InvalidEmailException específica. Esto te permite manejar diferentes tipos de errores de diferentes maneras, haciendo que tu manejo de errores sea más específico e informativo.
<?php
try {
validateEmail("invalid-email");
} catch (InvalidEmailException $e) {
echo "Email error: " . $e->getMessage();
}
?>Este enfoque te brinda un control preciso sobre el manejo de errores, permitiéndote responder de manera diferente a diversos tipos de problemas en tu aplicación.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Desafío
FácilRecibirás tres entradas: una cadena de nombre de usuario, una cadena de contraseña y un número de longitud mínima de contraseña. El nombre de usuario no debe estar vacío y la contraseña debe cumplir con el requisito de longitud mínima.
Crea una clase de excepción personalizada llamada InvalidCredentialsException que extienda la clase base Exception.
Crea una función llamada validateCredentials que acepte tres parámetros: nombre de usuario, contraseña y longitud mínima. Dentro de esta función:
- Si el nombre de usuario está vacío (una cadena vacía), lanza una
InvalidCredentialsExceptioncon el mensaje"Username cannot be empty" - Si la longitud de la contraseña es menor que la longitud mínima, lanza una
InvalidCredentialsExceptioncon el mensaje"Password must be at least X characters long"(donde X es el valor de la longitud mínima) - Si ambas validaciones pasan, imprime
"Credentials are valid"
Usa un bloque try...catch para llamar a la función con las entradas proporcionadas. En el bloque catch, captura específicamente la InvalidCredentialsException e imprime "Validation error: " seguido del mensaje de la excepción utilizando el método getMessage().
Formato de entrada:
- Primera línea: Una cadena que representa el nombre de usuario (ejemplo:
john_doeo una cadena vacía) - Segunda línea: Una cadena que representa la contraseña (ejemplo:
pass123) - Tercera línea: Un número entero que representa la longitud mínima de la contraseña (ejemplo:
8)
Salida esperada:
- Si las credenciales son válidas:
Credentials are valid - Si el nombre de usuario está vacío:
Validation error: Username cannot be empty - Si la contraseña es demasiado corta:
Validation error: Password must be at least X characters long(donde X es la longitud mínima)
Hoja de referencia
Para usar excepciones personalizadas, lanza una instancia de tu clase personalizada y captura ese tipo de excepción específico:
<?php
class InvalidEmailException extends Exception {}
function validateEmail($email) {
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidEmailException("Invalid email format: " . $email);
}
echo "Email is valid!";
}
try {
validateEmail("invalid-email");
} catch (InvalidEmailException $e) {
echo "Email error: " . $e->getMessage();
}
?>Esto permite un manejo de errores preciso al capturar tipos de excepciones específicos en lugar de objetos Exception genéricos.
Pruébalo tú mismo
<?php
// Leer entrada
$username = trim(fgets(STDIN));
$password = trim(fgets(STDIN));
$minLength = intval(fgets(STDIN));
// TODO: Escribe tu código a continuación
// 1. Crea la clase InvalidCredentialsException
// 2. Crea la función validateCredentials
// 3. Usa un bloque try...catch para llamar a la función y manejar excepciones
?>Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
1Funciones avanzadas
Funciones anónimasClosures y 'use'Funciones de flechaFunciones callbackUso de 'call_user_func'Funciones variablesPaso por referenciaFunciones recursivasResumen: Miscelánea de funciones4Arreglos multidimensionales
Crear un arreglo 2DAcceder a elementos de un arreglo 2DModificar elementos de un arreglo 2DIterar con bucles anidadosArreglos asociativos 2DResumen: Ejercicio de cuadrícula simple2Manipulación avanzada de arrays
Agregar con 'array_push'Eliminar con 'array_pop'Agregar con 'array_unshift'Eliminar con 'array_shift'Fusionar arrays indexadosFusionar arrays asociativosExtraer con 'array_slice'Valores con 'in_array'Claves con 'array_search'Resumen: Ejercicio de Playlist5Registro de Calificaciones
Configuración del Proyecto: Estructura de DatosAgregar un Nuevo EstudianteAgregar una Calificación a un EstudianteCalcular el Promedio del EstudianteEncontrar al Mejor EstudianteGenerar un Reporte de Calificaciones8Manejo de errores y excepciones
Entendiendo los errores de PHPEl bloque 'try...catch'El bloque 'finally'Lanzar una excepciónCrear una excepción personalizadaUsar una excepción personalizadaResumen: Validación de entradas3Ordenar Arrays
Ordenar arrays indexados de forma ascendenteOrdenar arrays indexados de forma descendenteOrdenar arrays asociativos por valorOrdenar arrays asociativos por claveOrdenación por orden naturalOrdenación personalizada con 'usort'Resumen: Ordenar tablas de clasificación