manipulação de exceção PHP
Excepção para mudar o erro de script ocorre quando o fluxo normal especificada.
O que é anormal
PHP 5 oferece um novo método para a manipulação orientada a objeto de erro.
A manipulação de exceção é usado quando o erro especificado (exceção) ocorre para alterar o fluxo normal do script. Esta condição é chamada uma exceção.
Quando uma exceção é acionada, normalmente ela ocorre:
- estado de código atual é salvo
- execução de código é transferido para um (personalizado) função pré-definida manipulador de exceção
- Em alguns casos, o processador pode ser reiniciada a partir do código armazenado no código de status, terminar a execução do script ou continuar o script a partir de um código local diferente
Vamos mostrar os diferentes métodos de tratamento de erros:
- exceção uso básico
- Criando um manipulador de exceção personalizada
- várias exceções
- relança
- Top-level set manipulador de exceção
Nota: As excepções só devem utilizar em caso de erro, ele não deve ser usado num ponto especificado para saltar para outro local no código.
exceção uso básico
Quando uma exceção é lançada, o código subsequente não procede, o PHP irá tentar encontrar a correspondência bloco "catch".
Se uma exceção não for pega, mas não qualquer com o uso de set_exception_handler () para o tratamento correspondente, em seguida, um erro grave (erro fatal) ocorre, e as mensagens de saída "exceção não pega" (exceção não detectada) de erro.
Vamos tentar lançar uma exceção, mas não pegá-lo:
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("Value must be 1 or below"); } return true; } // 触发异常 checkNum(2); ?>
O código acima irá obter um erro semelhante a este:
Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in /www/w3big/test/test.php:7 Stack trace: #0 /www/w3big/test/test.php(13): checkNum(2) #1 {main} thrown in /www/w3big/test/test.php on line 7
Tente, jogar e pegar
Para evitar erros que aparecem no exemplo acima, precisamos criar o código apropriado para lidar com exceções.
código de excepção manipulação adequada deve incluir:
- Tente - usando função anormal deve estar localizado dentro do bloco "try". Se nenhuma exceção é acionada, o código continuará como de costume. No entanto, se uma exceção é acionada, ele irá lançar uma exceção.
- Throw - em como acionar as disposições de excepção. Cada "jogar" deve corresponder a pelo menos um "catch".
- Trave - bloco "catch" captura a exceção e cria um objeto que contém a mensagem de exceção.
Vamos desencadear uma exceção:
<?php // 创建一个有异常处理的函数 function checkNum($number) { if($number>1) { throw new Exception("变量值必须小于等于 1"); } return true; } // 在 try 块 触发异常 try { checkNum(2); // 如果抛出异常,以下文本不会输出 echo '如果输出该内容,说明 $number 变量'; } // 捕获异常 catch(Exception $e) { echo 'Message: ' .$e->getMessage(); } ?>
O código acima irá obter um erro como este:
Message: 变量值必须小于等于 1
Exemplos explicar:
O código acima lança uma exceção e pega-lo:
- Criar função checkNum (). Ele detecta se um número é maior que um. Se for, uma exceção é lançada.
- Chamar função checkNum () em um bloco "try".
- checkNum () exceção função é lançada.
- "Catch" bloco recebe a exceção e cria um objeto que contém informações sobre a exceção ($ e).
- Chamando $ e- partir desta objetos de exceção> getMessage (), a saída da mensagem de erro para a exceção.
No entanto, a fim de seguir o "cada lance deve corresponder a um catch" princípio, você pode configurar um manipulador de exceção de nível superior para lidar com erros não atendidas.
Criar uma classe de exceção personalizada
Criando um manipulador de exceção personalizada é muito simples. Nós simplesmente criamos uma classe especial, quando uma exceção ocorre em PHP, você pode chamar suas funções. A classe deve ser uma extensão da classe de exceção.
A classe de exceção personalizada herda todos os atributos definidos na classe de exceção PHP, você pode querer adicionar funções personalizadas.
Comece por criar classes de exceção:
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "[email protected]"; try { // 检测邮箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new customException($email); } } catch (customException $e) { //display custom message echo $e->errorMessage(); } ?>
Esta nova classe é uma cópia da antiga classe de exceção, mais a função errorMessage (). Porque é uma cópia da antiga classe, por isso, herda as propriedades da classe de idade e métodos, podemos usar os métodos da classe de exceção, como getLine (), getFile () e getMessage ().
Exemplos explicar:
O código acima lança uma exceção, e através de uma classe de exceção personalizada para capturá-lo:
- customException () da classe como uma extensão da antiga classe de exceção para criar. Para que ele herda todos os atributos e métodos da velha classe de exceção.
- Criar função errorMessage (). Se o endereço de e-mail é inválido, a função retorna uma mensagem de erro.
- A variável $ email está definido para cadeia endereço de e-mail inválido.
- A implementação do bloco "try", uma vez que o endereço de e-mail não é válido e, portanto, gera uma exceção.
- "Catch" bloco para capturar a exceção e exibe uma mensagem de erro.
várias exceções
Você pode usar várias exceções como um script para detectar uma variedade de situações.
Você pode usar o bloco de múltipla if..else, ou um bloco de interruptor de código, 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() { // 错误信息 $errorMsg = '错误行号 '.$this->getLine().' in '.$this->getFile() .': <b>'.$this->getMessage().'</b> 不是一个合法的 E-Mail 地址'; return $errorMsg; } } $email = "[email protected]"; try { // 检测邮箱 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new customException($email); } // 检测 "example" 是否在邮箱地址中 if(strpos($email, "example") !== FALSE) { throw new Exception("$email 是 example 邮箱"); } } catch (customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>
Exemplos explicar:
O código acima testa duas condições, se houver uma condição não for satisfeita, então lançar uma exceção:
- customException () da classe como uma extensão da antiga classe de exceção para criar. Para que ele herda todos os atributos e métodos da velha classe de exceção.
- Criar função errorMessage (). Se o endereço de e-mail é inválido, a função retorna uma mensagem de erro.
- A variável $ email é definido como uma cadeia que é um endereço de e-mail válido, mas contém a cadeia "exemplo".
- A implementação de "tentar" bloco de código na primeira condição, nenhuma exceção é lançada.
- Uma vez que o e-mail contém o "exemplo" string, a segunda condição desencadeia uma exceção.
- "Catch" bloco de captura a exceção e exibir a mensagem de erro apropriada.
Se exceção classe customException é jogado, mas não pegou customException, capturado apenas uma exceção base, onde as exceções do punho.
relança
Às vezes, quando uma exceção é lançada, você pode querer ser diferente da forma padrão de lidar com isso. Pode voltar a ser jogado em um bloco "catch".
O script deve ser escondido dos erros do sistema do usuário. Para os programadores, erros de sistema pode ser importante, mas o usuário não está interessado neles. Para tornar mais fácil para os usuários a usar, você pode lançar uma exceção novamente com mensagem relativamente user-friendly:
<?php class customException extends Exception { public function errorMessage() { // 错误信息 $errorMsg = $this->getMessage().' 不是一个合法的 E-Mail 地址。'; return $errorMsg; } } $email = "[email protected]"; try { try { // 检测 "example" 是否在邮箱地址中 if(strpos($email, "example") !== FALSE) { // 如果是个不合法的邮箱地址,抛出异常 throw new Exception($email); } } catch(Exception $e) { // 重新抛出异常 throw new customException($email); } } catch (customException $e) { // 显示自定义信息 echo $e->errorMessage(); } ?>
Exemplos explicar:
O código acima é detectado no endereço de e-mail se ele contém a cadeia "exemplo". Se não é, novamente, uma exceção é lançada:
- customException () da classe como uma extensão da antiga classe de exceção para criar. Para que ele herda todos os atributos e métodos da velha classe de exceção.
- Criar função errorMessage (). Se o endereço de e-mail é inválido, a função retorna uma mensagem de erro.
- A variável $ email é definido como uma cadeia que é um endereço de e-mail válido, mas contém a cadeia "exemplo".
- "Experimente" bloco contém um outro bloco "try" de código, para que possa lançar uma exceção novamente.
- Uma vez que o e-mail contém o "exemplo" string, e, portanto, desencadear uma exceção.
- "Catch" bloco para capturar a exceção e re-lance "customException".
- Capturados "customException", e exibe uma mensagem de erro.
Se uma exceção não é detectada no bloco atual "tentar", ele olha para o bloco catch em um nível superior.
Top-level set manipulador de exceção
função set_exception_handler () pode ser configurado para lidar com todas exceção não capturada de funções definidas pelo usuário.
<?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 de cima é o seguinte:
Exception: Uncaught Exception occurred
No código acima, não há nenhum bloco "catch", mas o manipulador de exceção de nível superior acionado. Esta função deve ser usada para capturar todos os exceção não capturada.
regra de exceção
- código de manipulação de exceção precisa ser colocado em um bloco try, a fim de capturar possíveis exceções.
- Cada bloco de código jogue ou tente deve ter pelo menos um correspondente catch bloco.
- Você pode usar vários blocos catch para capturar diferentes tipos de exceções.
- Pode estar dentro do bloco de código try lança bloco catch (novamente jogado) exceção.
Em suma: se você lançar uma exceção, você deve pegá-lo.