English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este tutorial, aprenderá cómo lanzar y capturar excepciones en PHP.
una excepción es una señal que indica que se ha producido algún tipo de evento o error anómalo. Puede deberse a varias razones, como fallo en la conexión o consulta de la base de datos, intento de acceso a un archivo que no existe, etc.
PHP ofrece un mecanismo de gestión de excepciones poderoso que le permite manejar excepciones de manera elegante. A diferencia del enfoque tradicionalde erroresdiferente al sistema de gestión de erroresorientada a objetosEste método, que proporciona una forma más específica y flexible de reportar errores. 5introducidos.
En el enfoque basado en excepciones, el código se escribe dentro de un bloque try, y cuando se produce un evento de excepción durante la ejecución del código dentro del bloque try, se puede lanzar una excepción utilizando la sentencia throw. Luego, se captura y se analiza con uno o más bloques catch.
El siguiente ejemplo muestra cómo funciona la gestión de excepciones:
<?php function division($dividend, $divisor) { //Si el divisor es cero, se lanzará una excepción if($divisor == 0) { throw new Exception('División por cero.'); } else { $quotient = $dividend / $divisor; echo "<p>$dividend / $divisor = $quotient</p>"; } } try{ division(10, 2); division(30, -4); division(15, 0); //Si se lanza una excepción, las líneas posteriores no se ejecutarán echo '<p>Todas las operaciones se han ejecutado con éxito.</p>'; } catch(Exception $e){ //Manejo de excepciones echo "<p>Excepción capturada: " . $e->getMessage() . "</p>"; } // Continuar ejecutando echo "<p>Hello World!/p>"; ?>
Puede que desee saber de qué trata este código. Bueno, vamos a recorrer cada parte de este código paso a paso para entender mejor.
El sistema de manejo de excepciones de PHP tiene cuatro partes básicas: try, throw, catch y la clase Exception. A continuación, se describe cómo funcionan cada una de estas partes.
La función division() del ejemplo anterior verifica si el divisor es cero. Si lo es, lanza una excepción utilizando la sentencia throw de PHP. De lo contrario, esta función realiza la división con los números dados y muestra el resultado.
Luego, se llama a la función division() con diferentes parámetros en el bloque try. Si se genera una excepción mientras se ejecuta el código en el bloque try, PHP detiene la ejecución en ese punto y trata de encontrar el bloque catch correspondiente. Si encuentra uno, ejecuta el código del bloque catch; de lo contrario, genera un error fatal.
catch bloque generalmente captura excepciones lanzadas en el bloque try y crea un objeto que contiene información sobre la excepción ($e). Se puede recuperar el mensaje de error del objeto utilizando el método getMessage() de la excepción.
En la clase de excepciones de PHP también se proporcionan métodos como getCode(), getFile(), getLine() y getTraceAsString() para generar información de depuración detallada.
<?php //关闭默认错误报告 error_reporting(0); try{ $file = "somefile.txt"; //尝试打开文件 $handle = fopen($file, "r"); if(!$handle){ throw new Exception("无法打开文件!", 5); } //尝试读取文件内容 $content = fread($handle, filesize($file)); if(!$content){ throw new Exception("Could not read file!", 10); } //关闭文件句柄 fclose($handle); //显示文件内容 echo $content; } catch(Exception $e){ echo "<h3>Caught Exception!/h3>"; echo "<p>Error message: " . $e->getMessage() . "</p>"; echo "<p>File: " . $e->getFile() . "</p>"; echo "<p> Línea: " . $e->getLine() . "</p>"; echo "<p>Código de error: " . $e->getCode() . "</p>"; echo "<p>Trace: " . $e->getTraceAsString() . "</p>"; } ?>
El constructor de la excepción puede optar por aceptar un mensaje de excepción y un código de excepción. Aunque el mensaje de excepción se utiliza generalmente para mostrar información general sobre la causa del error, el código de excepción se puede usar para clasificar errores. Más tarde, se puede recuperar el código de excepción proporcionado mediante el método getCode() de Exception.
Consejo:Las excepciones solo se aplican a representar situaciones especiales; no se deben usar para especificar el flujo normal de la aplicación, como saltar a otro lugar del script. Esto puede afectar negativamente el rendimiento de la aplicación.
Incluso puedes definir tu propio manejador de excepciones personalizado para manejar diferentes tipos de excepciones de manera diferente. Esto permite usar bloques catch individuales para cada tipo de excepción.
Puedes extender la clase Exception para definir tus propias excepciones personalizadas, ya que Exception es la clase base para todas las excepciones. Las clases de excepciones personalizadas heredan todas las propiedades y métodos de la clase Exception de PHP. También puedes agregar métodos personalizados a la clase de excepciones personalizadas. Veamos el siguiente ejemplo:
<?php //Extiende la clase Exception class EmptyEmailException extends Exception {} class InvalidEmailException extends Exception {} $email = "[email protected]"; try{ //Si el correo electrónico está vacío, lanza una excepción if($email == ""){ throw new EmptyEmailException("<p>Por favor, ingrese su dirección de correo electrónico!</p> } //Si el correo electrónico no es válido, lanza una excepción if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { throw new InvalidEmailException("<p><b>$email</b> ¡No es una dirección de correo electrónico válida!/p> } // Si el correo electrónico es válido, muestra un mensaje de éxito echo "<p>Éxito: Verificación de correo electrónico exitosa.</p>"; catch(EmptyEmailException $e){ echo $e->getMessage(); catch(InvalidEmailException $e){ echo $e->getMessage(); } ?>
En el ejemplo anterior, hemos derivado dos nuevas clases de excepciones de la clase base Exception:EmptyEmailExceptionyInvalidEmailException. Se utilizan múltiples bloques de captura para mostrar mensajes de error diferentes, dependiendo del tipo de excepción generada.
Dado que estas clases de excepciones personalizadas heredan las propiedades y métodos de la clase Exception, podemos usar métodos de clase de excepción como getMessage(), getLine(), getFile(), etc. para recuperar la información de error del objeto de excepción.
Como se discutió en el capítulo anterior, si no se captura una excepción, PHP generará un error fatal con el mensaje "Excepción no capturada ...". Este mensaje de error puede contener información sensible, como el nombre del archivo y el número de línea donde se produjo el problema. Si no desea que los usuarios vean esta información, puede crear una función personalizada y registrarla en la función set_exception_handler() para manejar todas las excepciones no capturadas.
<?php function handleUncaughtException($e){ //Mostrar mensaje de error general al usuario echo "¡Ay! Ha surgido algún problema. Por favor, inténtelo de nuevo, si el problema persiste, póngase en contacto con nosotros."; // Construir una cadena de error $error = "Excepción no capturada: " . $message = date("Y-m-d H:i:s - "); $error .= $e->getMessage() . " en el archivo " . $e->getFile() . " en la línea " . $e->getLine() . "\n"; //Registrar detalles de errores en el archivo error_log($error, 3, "var/log/exceptionLog.log"); } //Registrar un gestor de excepciones personalizado set_exception_handler("handleUncaughtException"); // Lanzar excepción throw new Exception("Testing Exception!"); ?>
Atención:Las excepciones no capturadas siempre causan que el script finalice. Por lo tanto, si se desea que el script continúe ejecutándose después del punto de excepción, cada bloque try debe tener al menos un bloque catch correspondiente.