Las excepciones se utilizan para alterar el flujo normal de un script cuando ocurre un error específico.
PHP 5 proporciona un nuevo enfoque orientado a objetos para el manejo de errores.
El manejo de excepciones se utiliza para alterar el flujo normal de un script cuando ocurre una condición de error (excepción) específica. Esta situación se llama excepción.
Cuando se activa una excepción, suele ocurrir:
Se guarda el estado actual del código.
La ejecución del código se cambia a una función de controlador de excepciones predefinida (personalizada)
Dependiendo de la situación, el procesador puede reiniciar la ejecución del código desde un estado de código guardado, finalizar la ejecución del script o continuar la ejecución del script desde otra ubicación del código.
Mostraremos diferentes métodos de manejo de errores:
Uso básico de excepciones.
Crear un controlador de excepciones personalizado
Múltiples excepciones
volver a lanzar la excepción
Establecer un controlador de excepciones de nivel superior
Nota: Las excepciones solo deben usarse en situaciones de error y no deben usarse para saltar a otra ubicación del código en un punto específico.
Cuando se produce una excepción, el siguiente código no continuará ejecutándose y PHP intentará encontrar un bloque de código "catch" coincidente.
Si la excepción no se detecta y no se maneja en consecuencia usando set_exception_handler(), se producirá un error grave (error fatal) y se generará un mensaje de error de "Excepción no detectada".
Intentemos lanzar una excepción sin detectarla:
<?php // Crea una función con manejo de excepciones función comprobarNum ( $número ) { si ( $número > 1 ) { tirar nuevo Excepción ( " El valor debe ser 1 o inferior " ) ; devolver verdadero ; } // desencadenar excepción comprobarNum ( 2 ) ? >
El código anterior obtendrá un error similar a este:
Error grave: excepción no detectada 'Excepción' con el mensaje 'El valor debe ser 1 o inferior' en /www/codercto/test/test.php:7 Seguimiento de pila: #0 /www/codercto/test/test.php(13): checkNum(2) #1 {main} agregado en /www/codercto/test/test.php en la línea 7
Para evitar el error que se ve en el ejemplo anterior, necesitamos crear el código apropiado para manejar las excepciones.
El código de manejo de excepciones apropiado debe incluir:
Probar: las funciones que utilizan excepciones deben estar dentro de un bloque "probar". Si no se activa ninguna excepción, el código continúa ejecutándose como de costumbre. Pero si se activa una excepción, se lanzará una excepción.
Lanzar: especifica cómo desencadenar la excepción. Cada "lanzamiento" debe corresponder al menos a una "captura".
Catch: el bloque "catch" detecta la excepción y crea un objeto que contiene la información de la excepción.
Activemos una excepción:
<?php // Crea una función con manejo de excepciones función comprobarNum ( $número ) { si ( $número > 1 ) { tirar nuevo Excepción ( " El valor de la variable debe ser menor o igual a 1 " ) ; devolver verdadero ; } // Activar excepción en bloque try intentar { checkNum ( 2 ) ; // Si se lanza una excepción, no se generará el siguiente texto eco ' Si se genera este contenido, explique la variable $number ' } // captura de excepción captura ( excepción $e ) { eco ' Mensaje: ' . $e - > obtenerMensaje ( ) ; ?>
El código anterior obtendrá un error similar a este:
Mensaje: El valor de la variable debe ser menor o igual a 1
El código anterior genera una excepción y la detecta:
Crear la función checkNum(). Detecta si el número es mayor que 1. Si es así, lanza una excepción.
Llame a la función checkNum() en el bloque "try".
Se lanza una excepción en la función checkNum().
El bloque de código "catch" recibe la excepción y crea un objeto ($e) que contiene la información de la excepción.
Genere el mensaje de error de esta excepción llamando a $e->getMessage() desde este objeto de excepción.
Sin embargo, para seguir el principio de "cada lanzamiento debe corresponder a una captura", puede configurar un controlador de excepciones de nivel superior para manejar los errores perdidos.
Crear controladores de excepciones personalizados es muy sencillo. Simplemente creamos una clase especializada cuyas funciones se pueden llamar cuando ocurre una excepción en PHP. Esta clase debe ser una extensión de la clase de excepción.
Esta clase personalizada de excepción hereda todas las propiedades de la clase de excepción de PHP y puede agregarle funciones personalizadas.
Comenzamos creando la clase customException:
<?php clase excepción personalizada se extiende Excepción { público función mensaje de error ( ) { // mensaje de error $errorMsg = ' Número de línea de error ' . $ this -> getLine ( ) ' in ' $ this - > getFile ( ) ' : <b> ' $ this - > getMessage ( ) . Una dirección de correo electrónico válida ' ; $mensaje de error ; } $correo electrónico = " alguien @ejemplo...com " ; { // Detectar correo electrónico if ( filtro_var ( $correo electrónico , FILTER_VALIDATE_EMAIL ) === FALSO ) { // Si es una dirección de correo electrónico ilegal, lanza una excepción tirar nuevo excepción personalizada ( $correo electrónico ) ; } atrapar ( excepción personalizada $e ) { // mostrar mensaje personalizado eco $e - > mensaje de error ( ) } ?>
Esta nueva clase es una copia de la antigua clase de excepción, más la función errorMessage(). Solo porque es una copia de la clase anterior, hereda propiedades y métodos de la clase anterior, y podemos usar los métodos de la clase de excepción, como getLine(), getFile() y getMessage().
El código anterior genera una excepción y la detecta mediante una clase de excepción personalizada:
La clase customException() se creó como una extensión de la antigua clase de excepción. De esta forma hereda todas las propiedades y métodos de la antigua clase de excepción.
Crear la función errorMessage(). Si la dirección de correo electrónico no es válida, esta función devuelve un mensaje de error.
Establezca la variable $email en una cadena de dirección de correo electrónico ilegal.
Se ejecuta el bloque de código "try" y se genera una excepción porque la dirección de correo electrónico no es válida.
El bloque de código "catch" detecta la excepción y muestra un mensaje de error.
Puede utilizar varias excepciones para que un script detecte varias situaciones.
Puede utilizar varios bloques de código if...else, o un bloque de código de cambio, o anidar varias excepciones. Estas excepciones pueden utilizar diferentes clases de excepción y devolver diferentes mensajes de error:
<?php clase excepción personalizada se extiende Excepción { público función mensaje de error ( ) { // mensaje de error $errorMsg = ' Número de línea de error ' . $ this -> getLine ( ) ' in ' $ this - > getFile ( ) ' : <b> ' $ this - > getMessage ( ) . Una dirección de correo electrónico válida ' ; $mensaje de error ; } $correo electrónico = " [email protected] " ; intente { // Detectar correo electrónico if ( filtro_var ( $correo electrónico , FILTER_VALIDATE_EMAIL ) === FALSO ) { // Si es una dirección de correo electrónico ilegal, lanza una excepción tirar nuevo excepción personalizada ( $correo electrónico ) ; // Comprueba si "ejemplo" está en la dirección de correo electrónico if ( strpos ( $correo electrónico , " ejemplo " ) ! == FALSO ) { tirar nuevo Excepción ( " $email es el buzón de ejemplo " ) ; } atrapar ( excepción personalizada $e ) { eco $e - > mensaje de error ( ) } captura ( excepción $e ) { eco $e - > obtenerMensaje ( ) } ?>
El código anterior prueba dos condiciones y genera una excepción si alguna de las condiciones no es verdadera:
La clase customException() se creó como una extensión de la antigua clase de excepción. De esta forma hereda todas las propiedades y métodos de la antigua clase de excepción.
Crear la función errorMessage(). Si la dirección de correo electrónico no es válida, esta función devuelve un mensaje de error.
Establezca la variable $email en una cadena que sea una dirección de correo electrónico válida pero que contenga la cadena "ejemplo".
Ejecute el bloque de código "try" y, en la primera condición, no se generará ninguna excepción.
Dado que el correo electrónico contiene la cadena "ejemplo", la segunda condición desencadenará una excepción.
El bloque "catch" detecta la excepción y muestra un mensaje de error apropiado.
Si la clase customException genera una excepción, pero no se detecta, solo se detecta la excepción base y la excepción se maneja allí.
A veces, cuando se produce una excepción, es posible que desee manejarla de manera diferente al estándar. La excepción se puede lanzar nuevamente en un bloque "catch".
El script debe ocultar los errores del sistema al usuario. Los errores del sistema pueden ser importantes para los programadores, pero a los usuarios no les interesan. Para hacerlo más fácil para los usuarios, puede lanzar la excepción nuevamente con un mensaje fácil de usar:
<?php clase excepción personalizada se extiende Excepción { público función mensaje de error ( ) { // mensaje de error $errorMsg = $this -> getMessage ( ) ' No es una dirección de correo electrónico válida. ' ; devolver $mensaje de error ; } $correo electrónico = " [email protected] " ; intente { intentar { // Comprueba si "ejemplo" está en la dirección de correo electrónico if ( strpos ( $correo electrónico , " ejemplo " ) ! == FALSO ) { // Si es una dirección de correo electrónico ilegal, lanza una excepción tirar nuevo Excepción ( $correo electrónico ) ; } captura ( excepción $e ) { // Lanzar de nuevo la excepción tirar nuevo excepción personalizada ( $correo electrónico ) ; } atrapar ( excepción personalizada $e ) { // Mostrar información personalizada eco $e - > mensaje de error ( ) } ?>
El código anterior detecta si la cadena "ejemplo" está contenida en la dirección de correo electrónico. Si es así, lanza la excepción nuevamente:
La clase customException() se creó como una extensión de la antigua clase de excepción. De esta forma hereda todas las propiedades y métodos de la antigua clase de excepción.
Crear la función errorMessage(). Si la dirección de correo electrónico no es válida, esta función devuelve un mensaje de error.
Establezca la variable $email en una cadena que sea una dirección de correo electrónico válida pero que contenga la cadena "ejemplo".
Un bloque "try" contiene otro bloque "try" para que la excepción pueda lanzarse nuevamente.
Debido a que el correo electrónico contiene la cadena "ejemplo", se activa la excepción.
El bloque de código "catch" detecta la excepción y vuelve a generar "customException".
Se detecta "customException" y se muestra un mensaje de error.
Si la excepción no se detecta en el bloque "try" actual, buscará un bloque catch en un nivel superior.
La función set_exception_handler() establece una función definida por el usuario que maneja todas las excepciones no detectadas.
<?php función miExcepción ( $excepción ) { eco " <b>Excepción:</b> " , $ excepción -> getMessage ( ) } set_exception_handler ( ' myException ' ) ; nuevo ¿ Excepción ( ' Se produjo una excepción no detectada ' ) ? >
La salida del código anterior se ve así:
Excepción: se produjo una excepción no detectada
En el código anterior, no hay ningún bloque "catch", sino que se activa el controlador de excepciones de nivel superior. Esta función debe usarse para detectar todas las excepciones no detectadas.
El código que requiere manejo de excepciones debe colocarse dentro de un bloque try para detectar posibles excepciones.
Cada bloque de intento o lanzamiento debe tener al menos un bloque de captura correspondiente.
Utilice múltiples bloques catch para detectar diferentes tipos de excepciones.
Las excepciones se pueden lanzar (volver a lanzar) en un bloque catch dentro de un bloque try.
En resumen: si se lanza una excepción, debes detectarla.