Los últimos tutoriales de desarrollo web
 

PHP Manejo de excepciones


Las excepciones se utilizan para cambiar el flujo normal de una secuencia de comandos si se produce un error especificado.


¿Qué es una excepción

Con PHP 5 llegó una nueva forma orientada a objetos de tratamiento de errores.

El manejo de excepciones se utiliza para cambiar el flujo normal de la ejecución de código si un error especificado (exceptional) se produce condición. Esta condición se llama una excepción.

Esto es lo que sucede normalmente cuando se activa una excepción:

  • El estado actual código se guarda
  • La ejecución de código va a cambiar a una predefinida (custom) la función de gestión de excepciones
  • Dependiendo de la situación, el controlador puede entonces reanudar la ejecución del código de estado guardado, terminar la ejecución del script o continuar la secuencia de comandos desde un lugar diferente en el código

Vamos a mostrar los diferentes métodos de tratamiento de errores:

  • Uso básico de Excepciones
  • La creación de un manejador de excepción personalizada
  • múltiples excepciones
  • Vuelva a lanzar una excepción
  • El establecimiento de un gestor de excepciones de nivel superior

Note: Las excepciones sólo deben utilizarse con condiciones de error y no se deben utilizar para saltar a otro lugar en el código en un punto especificado.


Uso básico de Excepciones

Cuando se produce una excepción, el siguiente código no se ejecutará, y PHP intentará encontrar la coincidencia de "catch" del bloque.

Si una excepción no se detecta, un error fatal se emitirá con una "Uncaught Exception" mensaje.

Vamos a tratar de lanzar una excepción y sin la captura de él:

<?php
//create function with an exception
function checkNum($number) {
  if($number>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

//trigger exception
checkNum(2);
?>

El código anterior obtendrá un error como este:

Fatal error : Uncaught exception 'Exception'
with message 'Value must be 1 or below' in C:\webfolder\test.php:6
Stack trace: #0 C:\webfolder\test.php(12):
checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6

Intenta, lanzar y atrapar

Para evitar el error en el ejemplo anterior, tenemos que crear el código adecuado para manejar una excepción.

código apropiado excepción debe incluir:

  1. Trate - Una función usando una excepción debe estar en un "try" bloque. Si la excepción no se activa, el código continuará con normalidad. Sin embargo, si la excepción desencadena, una excepción es "thrown"
  2. Lanzar - Esta es la forma en que se activa una excepción. Cada "throw" debe tener al menos una "catch"
  3. Catch - Un "catch" bloque recupera una excepción y crea un objeto que contiene la información de excepción

Vamos a tratar de desencadenar una excepción con código válido:

<?php
//create function with an exception
function checkNum($number) {
  if($number>1) {
    throw new Exception("Value must be 1 or below");
  }
  return true;
}

//trigger exception in a "try" block
try {
  checkNum(2);
  //If the exception is thrown, this text will not be shown
  echo 'If you see this, the number is 1 or below';
}

//catch exception
catch(Exception $e) {
  echo 'Message: ' .$e->getMessage();
}
?>

El código anterior obtendrá un error como este:

Message: Value must be 1 or below

Ejemplo explicó:

El código anterior genera una excepción y lo atrapa:

  1. El checkNum() se crea la función. Comprueba si un número es mayor que 1. Si lo es, se produce una excepción
  2. El checkNum() función es llamada en un "try" bloque
  3. La excepción dentro del checkNum() función es lanzada
  4. La "catch" bloque recupera la excepción y crea un objeto ($e) que contiene la información de excepción
  5. El mensaje de error de excepción se hizo eco llamando $e-> getMessage() del objeto de excepción

Sin embargo, una manera de moverse por la "every throw must have a catch" regla es para establecer un controlador de excepciones de nivel superior para controlar los errores que se deslizan a través.


Creación de una clase de excepción personalizada

Para crear un gestor de excepciones personalizado que debe crear una clase especial con funciones que se pueden llamar cuando se produce una excepción en PHP. La clase debe ser una extensión de la clase de excepción.

La clase de excepción personalizada hereda las propiedades de la clase de excepción de PHP y se puede añadir funciones personalizadas a la misma.

Vamos a crear una clase de excepción:

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    //throw exception if email is not valid
    throw new customException($email);
  }
}

catch (customException $e) {
  //display custom message
  echo $e->errorMessage();
}
?>

La nueva clase es una copia de la clase de excepción de edad, con una adición de la errorMessage() función. Dado que es una copia de la clase de edad, y hereda las propiedades y métodos de la clase de edad, podemos usar los métodos de la clase de excepción como getLine() y getFile() y getMessage() .

Ejemplo explicó:

El código anterior genera una excepción y atrapa con una clase de excepción personalizada:

  1. El customException() de clase se crea como una extensión de la clase de excepción de edad. De esta manera se hereda todos los métodos y propiedades de la clase de excepción de edad
  2. El errorMessage() se crea la función. Esta función devuelve un mensaje de error si una dirección de e-mail no es válida
  3. La variable $ correo electrónico se establece en una cadena que no es una dirección válida de correo electrónico
  4. El "try" bloque se ejecuta y se produce una excepción ya que el correo electrónico no es válido
  5. La "catch" bloque de captura la excepción y muestra el mensaje de error

múltiples Excepciones

Es posible que una secuencia de comandos para utilizar varias excepciones para comprobar si hay múltiples condiciones.

Es posible utilizar varios bloques if..else, un interruptor, o anidar varias excepciones. Estas excepciones pueden utilizar diferentes clases de excepción y devolver diferentes mensajes de error:

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
    .': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  //check if
  if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
    //throw exception if email is not valid
    throw new customException($email);
  }
  //check for "example" in mail address
  if(strpos($email, "example") !== FALSE) {
    throw new Exception("$email is an example e-mail");
  }
}

catch (customException $e) {
  echo $e->errorMessage();
}

catch(Exception $e) {
  echo $e->getMessage();
}
?>

Ejemplo explicó:

El código anterior prueba dos condiciones y lanza una excepción si no se cumple cualquiera de las condiciones:

  1. El customException() de clase se crea como una extensión de la clase de excepción de edad. De esta manera se hereda todos los métodos y propiedades de la clase de excepción de edad
  2. El errorMessage() se crea la función. Esta función devuelve un mensaje de error si una dirección de e-mail no es válida
  3. La variable $ correo electrónico se establece en una cadena que es una dirección de correo electrónico válida, pero contiene la cadena "example"
  4. El "try" bloque es ejecutado una excepción y no se lanza en la primera condición
  5. La segunda condición desencadena una excepción ya que el correo electrónico contiene la cadena "example"
  6. La "catch" bloque de captura la excepción y muestra el mensaje de error correcto

Si la excepción lanzada fuera de la customException clase y no había ninguna captura customException, sólo la captura excepción de base, la excepción sería manejado allí.


Re-lanzar excepciones

A veces, cuando se produce una excepción, es posible que desee para manejar la situación de manera diferente a la forma estándar. Es posible lanzar una excepción por segunda vez dentro de una "catch" del bloque.

Una secuencia de comandos debe ocultar errores en el sistema de los usuarios. Los errores del sistema pueden ser importantes para el codificador, pero no son de interés para el usuario. Para hacer las cosas más fáciles para el usuario puede volver a emitir la excepción con un mensaje fácil de usar:

<?php
class customException extends Exception {
  public function errorMessage() {
    //error message
    $errorMsg = $this->getMessage().' is not a valid E-Mail address.';
    return $errorMsg;
  }
}

$email = "[email protected]";

try {
  try {
    //check for "example" in mail address
    if(strpos($email, "example") !== FALSE) {
      //throw exception if email is not valid
      throw new Exception($email);
    }
  }
  catch(Exception $e) {
    //re-throw exception
    throw new customException($email);
  }
}

catch (customException $e) {
  //display custom message
  echo $e->errorMessage();
}
?>

Ejemplo explicó:

El código anterior comprueba si la dirección de correo electrónico contiene la cadena "example" en el que, si lo hace, la excepción es re-lanzado:

  1. El customException() de clase se crea como una extensión de la clase de excepción de edad. De esta manera se hereda todos los métodos y propiedades de la clase de excepción de edad
  2. El errorMessage() se crea la función. Esta función devuelve un mensaje de error si una dirección de e-mail no es válida
  3. La variable $ correo electrónico se establece en una cadena que es una dirección de correo electrónico válida, pero contiene la cadena "example"
  4. El "try" bloque contiene otra "try" de bloque para que sea posible volver a emitir la excepción
  5. La excepción se activa desde la dirección de correo contiene la cadena "example"
  6. La "catch" bloque de captura la excepción y re-lanza un "customException"
  7. El "customException" es capturado y muestra un mensaje de error

Si la excepción no se ve atrapado en su actual "try" bloque, se buscará un bloque catch en "higher levels" .


Establecer un manejador de excepción de nivel superior

El set_exception_handler() función establece una función definida por el usuario para manejar todas las excepciones no capturadas.

<?php
function myException($exception) {
  echo "<b>Exception:</b> " . $exception->getMessage();
}

set_exception_handler('myException');

throw new Exception('Uncaught Exception occurred');
?>

La salida del código anterior debería ser algo como esto:

Exception: Uncaught Exception occurred

En el código anterior no había "catch" bloque. En cambio, el gestor de excepciones de nivel superior activa. Esta función se debe utilizar para capturar las excepciones no capturadas.


Reglas para excepciones

  • Código puede estar rodeado en un bloque try, para ayudar a atrapar posibles excepciones
  • Cada bloque try o "throw" deben tener al menos un bloque catch correspondiente
  • bloques de capturas múltiples se pueden utilizar para capturar diferentes clases de excepciones
  • Las excepciones pueden ser lanzadas (or re-thrown) en un bloque de captura dentro de un bloque try

Una simple regla: Si tiras algo, tiene que atraparla.