tutoriais mais recente desenvolvimento web
 

PHP Manipulação de exceção


Exceções são usados ​​para alterar o fluxo normal de um script se ocorrer um erro especificado.


O que é uma exceção

Com PHP 5 veio uma nova forma orientada a objeto de lidar com erros.

A manipulação de exceção é usado para alterar o fluxo normal da execução de código se um erro especificado (exceptional) condição ocorre. Esta condição é chamada uma exceção.

Isto é o que normalmente acontece quando uma exceção é acionada:

  • O estado de código atual é salvo
  • A execução de código irá mudar para uma pré-definido (custom) função de manipulador de exceção
  • Dependendo da situação, o condutor pode, em seguida, retomar a execução do estado código guardado, terminar a execução de scripts ou continuar o roteiro de um local diferente no código

Vamos mostrar diferentes métodos de manipulação de erro:

  • Uso básico de Exceções
  • Criando um manipulador de exceção personalizada
  • várias exceções
  • Re-lançar uma exceção
  • Definir um manipulador de exceção de nível superior

Note: Exceções só deve ser usado com condições de erro, e não deve ser usado para saltar para outro lugar no código em um ponto especificado.


Use básico de Exceções

Quando uma exceção é lançada, o código a seguir não será executado, eo PHP irá tentar encontrar a correspondência "catch" bloco.

Se uma exceção não for pega, um erro fatal será emitida com uma "Uncaught Exception" mensagem.

Vamos tentar lançar uma exceção sem captura-lo:

<?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);
?>

O código acima irá obter um erro 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

Tente, jogar e pegar

Para evitar o erro do exemplo acima, precisamos criar o código apropriado para lidar com uma exceção.

código de exceção adequada deve incluir:

  1. Tente - A função usando uma exceção deve estar em "try" bloco. Se a exceção não aciona, o código continuará como normal. No entanto, se a exceção dispara, uma exceção é "thrown"
  2. Throw - Isto é como você acionar uma exceção. Cada "throw" deve ter pelo menos um "catch"
  3. Trave - Um "catch" bloco recupera uma excepção e cria um objecto contendo a informação de excepção

Vamos tentar desencadear uma exceção com 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();
}
?>

O código acima irá obter um erro como este:

Message: Value must be 1 or below

Exemplo explicado:

O código acima lança uma excepção e o apanha:

  1. O checkNum() função é criado. Ele verifica se um número é maior que 1. Se for, uma exceção é lançada
  2. O checkNum() função é chamada em uma "try" bloco
  3. A excepção dentro do checkNum() função é lançada
  4. A "catch" bloco recupera a excepção e cria um objecto ($e) contendo a informação de excepção
  5. A mensagem de erro de exceção é ecoado pelo telefone $e-> getMessage() do objeto de exceção

No entanto, uma maneira de contornar o "every throw must have a catch" regra é definir um manipulador de exceção de nível superior para lidar com erros que passar.


Criando uma classe de exceção personalizada

Para criar um manipulador de exceção personalizada, você deve criar uma classe especial com funções que podem ser chamados quando uma exceção ocorre em PHP. A classe deve ser uma extensão da classe de exceção.

A classe de exceção personalizada herda as propriedades da classe de exceção do PHP e você pode adicionar funções personalizadas para ele.

Vamos criar uma classe de exceção:

<?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();
}
?>

A nova classe é uma cópia da antiga classe de exceção com um acréscimo do errorMessage() função. Uma vez que é uma cópia da antiga classe, e ele herda as propriedades e métodos da velha classe, podemos usar os métodos da classe de exceção como getLine() e getFile() e getMessage() .

Exemplo explicado:

O código acima lança uma exceção e pega-lo com uma classe de exceção personalizada:

  1. O customException() classe é criada como uma extensão da antiga classe de exceção. Desta forma, ele herda todos os métodos e propriedades do antigo classe de exceção
  2. O errorMessage() função é criado. Esta função retorna uma mensagem de erro se um endereço de e-mail é inválido
  3. A variável $ email está definido para uma cadeia que não é um endereço de email válido
  4. O "try" bloco é executado e uma exceção é lançada uma vez que o endereço de e-mail é inválido
  5. O "catch" bloco de captura a exceção e exibe a mensagem de erro

vários Exceções

É possível que um script para usar várias exceções para verificar se há várias condições.

É possível utilizar vários blocos if..else, um interruptor, ou aninhar várias exceções. Essas exceções podem usar diferentes classes de exceção e retornar diferentes mensagens de erro:

<?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();
}
?>

Exemplo explicado:

O código acima testa duas condições e inicia uma excepção se qualquer das condições não forem satisfeitas:

  1. O customException() classe é criada como uma extensão da antiga classe de exceção. Desta forma, ele herda todos os métodos e propriedades do antigo classe de exceção
  2. O errorMessage() função é criado. Esta função retorna uma mensagem de erro se um endereço de e-mail é inválido
  3. A variável $ email está definido para uma cadeia que é um endereço de e-mail válido, mas contém a cadeia "example"
  4. O "try" bloco é executado e uma exceção não é lançada sobre a primeira condição
  5. A segunda condição desencadeia uma exceção desde que o e-mail contém a cadeia "example"
  6. O "catch" bloco de captura a exceção e exibe a mensagem de erro correta

Se a exceção lançada eram da customException classe e não houve captura customException, somente a captura de exceção base, a exceção seria tratado lá.


Re-lançamento de exceções

Às vezes, quando uma exceção é lançada, você pode querer lidar com isso de forma diferente da forma padrão. É possível lançar uma exceção uma segunda vez dentro de um "catch" bloco.

Um script deve esconder erros do sistema dos usuários. erros de sistema pode ser importante para o codificador, mas não são de interesse para o usuário. Para tornar as coisas mais fáceis para o usuário que você pode re-lançar a exceção com uma mensagem amigável:

<?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();
}
?>

Exemplo explicado:

O código acima testes, se o e-mail contém a cadeia "example" no-lo, se isso acontecer, a exceção é relançada:

  1. O customException() classe é criada como uma extensão da antiga classe de exceção. Desta forma, ele herda todos os métodos e propriedades do antigo classe de exceção
  2. O errorMessage() função é criado. Esta função retorna uma mensagem de erro se um endereço de e-mail é inválido
  3. A variável $ email está definido para uma cadeia que é um endereço de e-mail válido, mas contém a cadeia "example"
  4. O "try" bloco contém outra "try" bloco para torná-lo possível para re-lançar a exceção
  5. A exceção é acionada desde que o e-mail contém a cadeia "example"
  6. A "catch" bloco identificou a excepção e re-lança uma "customException"
  7. O "customException" é capturado e exibe uma mensagem de erro

Se a exceção não está preso em seu atual "try" bloco, ele irá procurar um bloco catch em "higher levels" .


Definir um manipulador de exceção de nível superior

O set_exception_handler() função define uma função definida pelo utilizador de lidar com todas as exceções.Ele.

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

set_exception_handler('myException');

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

A saída do código acima deve ser algo como isto:

Exception: Uncaught Exception occurred

No código de cima não houve "catch" bloco. Em vez disso, o manipulador de exceção de nível superior acionado. Esta função deve ser usada para pegar exceções.Ele.


Regras para exceções

  • Código pode ser cercado em um bloco try, para ajudar a pegar potenciais exceções
  • Cada bloco try ou "throw" deve ter pelo menos um bloco catch correspondente
  • Vários blocos catch pode ser usado para capturar diferentes classes de exceções
  • As excepções podem ser jogado (or re-thrown) em um bloco de captura dentro de um bloco de teste

Uma regra simples: Se você jogar alguma coisa, você tem que pegá-lo.