Exceções são usadas para alterar o fluxo normal de um script quando ocorre um erro especificado.
PHP 5 fornece uma nova abordagem orientada a objetos para tratamento de erros.
O tratamento de exceções é usado para alterar o fluxo normal de um script quando ocorre uma condição de erro (exceção) especificada. Esta situação é chamada de exceção.
Quando uma exceção é acionada, geralmente acontece:
O estado atual do código é salvo
A execução do código é alternada para uma função manipuladora de exceção predefinida (personalizada)
Dependendo da situação, o processador pode reiniciar a execução do código a partir de um estado de código salvo, encerrar a execução do script ou continuar a execução do script a partir de outro local no código.
Mostraremos diferentes métodos de tratamento de erros:
Uso básico de exceções
Crie um manipulador de exceções personalizado
Múltiplas exceções
exceção de relançamento
Definir manipulador de exceções de nível superior
Nota: As exceções só devem ser usadas em situações de erro e não devem ser usadas para saltar para outro local no código em um ponto especificado.
Quando uma exceção é lançada, o código a seguir não continuará a ser executado e o PHP tentará encontrar um bloco de código "catch" correspondente.
Se a exceção não for detectada e não for tratada adequadamente usando set_exception_handler(), um erro grave (erro fatal) ocorrerá e uma mensagem de erro "Exceção não detectada" será exibida.
Vamos tentar lançar uma exceção sem capturá-la:
<?php // Cria uma função com tratamento de exceções função checkNum ( $número ) { if ( $número > 1 ) { lançar novo Exception ( " O valor deve ser 1 ou menor " ) ; retornar verdadeiro ; } // aciona exceção verificarNum ( 2 ) ;
O código acima receberá um erro semelhante a este:
Erro fatal: Exceção não detectada 'Exceção' com mensagem 'O valor deve ser 1 ou inferior' em /www/codercto/test/test.php:7 Rastreamento de pilha: #0 /www/codercto/test/test.php(13): checkNum(2) #1 {main} lançado em /www/codercto/test/test.php na linha 7
Para evitar o erro visto no exemplo acima, precisamos criar código apropriado para lidar com exceções.
O código apropriado de tratamento de exceções deve incluir:
Try – Funções que usam exceções devem estar dentro de um bloco “try”. Se nenhuma exceção for acionada, o código continuará a execução normalmente. Mas se uma exceção for acionada, uma exceção será lançada.
Throw - especifica como disparar a exceção. Cada “lançamento” deve corresponder a pelo menos uma “pegada”.
Catch - O bloco "catch" captura a exceção e cria um objeto contendo as informações da exceção.
Vamos acionar uma exceção:
<?php // Cria uma função com tratamento de exceções função checkNum ( $número ) { if ( $número > 1 ) { lançar novo Exception ( " O valor da variável deve ser menor ou igual a 1 " ) ; retornar verdadeiro ; } // Aciona exceção no bloco try tentar { checkNum ( 2 ) ; // Se uma exceção for lançada, o texto a seguir não será exibido eco ' Se este conteúdo for gerado, explique a variável $ number ' ; // captura exceção pegar ( exceção $e ) { eco ' Mensagem: ' . $e - > getMessage ( ) ; ?>
O código acima receberá um erro semelhante a este:
Mensagem: O valor da variável deve ser menor ou igual a 1
O código acima lança uma exceção e a captura:
Crie a função checkNum(). Ele detecta se o número é maior que 1. Nesse caso, lance uma exceção.
Chame a função checkNum() no bloco “try”.
Uma exceção na função checkNum() é lançada.
O bloco de código "catch" recebe a exceção e cria um objeto ($e) contendo as informações da exceção.
Envie a mensagem de erro desta exceção chamando $e->getMessage() deste objeto de exceção.
No entanto, para seguir o princípio "cada lançamento deve corresponder a uma captura", você pode configurar um manipulador de exceções de nível superior para lidar com erros perdidos.
Criar manipuladores de exceções personalizados é muito simples. Simplesmente criamos uma classe especializada cujas funções podem ser chamadas quando ocorre uma exceção no PHP. Esta classe deve ser uma extensão da classe de exceção.
Esta classe customException personalizada herda todas as propriedades da classe de exceção do PHP e você pode adicionar funções personalizadas a ela.
Começamos criando a classe customException:
<?php aula customException estende Exceção { público função mensagem de erro ( ) { // mensagem de erro $ errorMsg = ' Número da linha de erro ' : $ this - > getMessage ( ) ' . Um endereço de e-mail válido return ' ; $ mensagem de erro } } $email = " alguém@exemplo... com " ; { // Detecta e-mail if ( filtro_var ( $e-mail , FILTER_VALIDATE_EMAIL ) === FALSO ) { // Se for um endereço de e-mail ilegal, lança uma exceção lançar novo customException ( $e- mail ) ; } pegar ( customException $e ) { // exibe mensagem personalizada eco $e -> mensagem de erro ( ) ; ?>
Esta nova classe é uma cópia da antiga classe de exceção, mais a função errorMessage(). Só porque é uma cópia da classe antiga, ela herda propriedades e métodos da classe antiga, e podemos usar os métodos da classe de exceção, como getLine(), getFile() e getMessage().
O código acima lança uma exceção e a captura por meio de uma classe de exceção personalizada:
A classe customException() foi criada como uma extensão da antiga classe de exceção. Desta forma ele herda todas as propriedades e métodos da antiga classe de exceção.
Crie a função errorMessage(). Se o endereço de e-mail não for válido, esta função retornará uma mensagem de erro.
Defina a variável $email como uma string de endereço de e-mail ilegal.
O bloco de código "try" é executado e uma exceção é lançada porque o endereço de e-mail é inválido.
O bloco de código "catch" captura a exceção e exibe uma mensagem de erro.
Você pode usar diversas exceções para um script detectar diversas situações.
Você pode usar vários blocos de código if..else, ou um bloco de código switch, ou aninhar várias exceções. Essas exceções podem usar diferentes classes de exceção e retornar diferentes mensagens de erro:
<?php aula customException estende Exceção { público função mensagem de erro ( ) { // mensagem de erro $ errorMsg = ' Número da linha de erro ' : $ this - > getMessage ( ) ' . Um endereço de e-mail válido return ' ; $ mensagem de erro } } $ email = " algué[email protected] " ; { // Detecta e-mail if ( filtro_var ( $e-mail , FILTER_VALIDATE_EMAIL ) === FALSO ) { // Se for um endereço de e-mail ilegal, lança uma exceção lançar novo customException ( $e- mail ) ; // Verifica se "exemplo" está no endereço de e-mail if ( strpos ( $email , " exemplo " ) ! == FALSO ) { lançar novo Exception ( " $email é a caixa de correio de exemplo " ) ; } pegar ( customException $e ) { eco $e -> mensagem de erro ( ) ; pegar ( exceção $e ) { eco $e - > getMessage ( ) ; ?>
O código acima testa duas condições e lança uma exceção se alguma das condições não for verdadeira:
A classe customException() foi criada como uma extensão da antiga classe de exceção. Desta forma ele herda todas as propriedades e métodos da antiga classe de exceção.
Crie a função errorMessage(). Se o endereço de e-mail não for válido, esta função retornará uma mensagem de erro.
Defina a variável $email como uma string que seja um endereço de e-mail válido, mas que contenha a string "exemplo".
Execute o bloco de código "try" e, na primeira condição, nenhuma exceção será lançada.
Como o e-mail contém a string “exemplo”, a segunda condição acionará uma exceção.
O bloco "catch" captura a exceção e exibe uma mensagem de erro apropriada.
Se a classe customException lançar uma exceção, mas a customException não for capturada, apenas a exceção base será capturada e a exceção será tratada lá.
Às vezes, quando uma exceção é lançada, você pode querer tratá-la de maneira diferente do padrão. A exceção pode ser lançada novamente em um bloco "catch".
O script deve ocultar erros do sistema do usuário. Erros de sistema podem ser importantes para programadores, mas os usuários não estão interessados neles. Para facilitar para os usuários, você pode lançar a exceção novamente com uma mensagem amigável:
<?php aula customException estende Exceção { público função mensagem de erro ( ) { // mensagem de erro $errorMsg = $this -> getMessage ( ) ' Não é um endereço de e-mail válido . ' ; retornar $ mensagem de erro } } $ email = " algué[email protected] " ; { tentar { // Verifica se "exemplo" está no endereço de e-mail if ( strpos ( $email , " exemplo " ) ! == FALSO ) { // Se for um endereço de e-mail ilegal, lança uma exceção lançar novo Exceção ( $e- mail ) ; } pegar ( exceção $e ) { // Relança a exceção lançar novo customException ( $e- mail ) ; } pegar ( customException $e ) { // Exibe informações personalizadas eco $e -> mensagem de erro ( ) ; ?>
O código acima detecta se a string “exemplo” está contida no endereço de e-mail. Se sim, lance a exceção novamente:
A classe customException() foi criada como uma extensão da antiga classe de exceção. Desta forma ele herda todas as propriedades e métodos da antiga classe de exceção.
Crie a função errorMessage(). Se o endereço de e-mail não for válido, esta função retornará uma mensagem de erro.
Defina a variável $email como uma string que seja um endereço de e-mail válido, mas que contenha a string "exemplo".
Um bloco “try” contém outro bloco “try” para que a exceção possa ser lançada novamente.
Como o e-mail contém a string "exemplo", a exceção é acionada.
O bloco de código "catch" captura a exceção e lança novamente "customException".
"customException" é capturado e uma mensagem de erro é exibida.
Se a exceção não for detectada no bloco "try" atual, ele procurará um bloco catch em um nível superior.
A função set_exception_handler() define uma função definida pelo usuário que trata todas as exceções não detectadas.
<?php função minhaExceção ( $exceção ) { eco " <b>Exceção:</b> " , $ exception -> getMessage ( ) ; set_exception_handler ( ' minhaExceção ' ) ; novo Exception ( ' Ocorreu uma exceção não detectada ' ) ;
A saída do código acima é semelhante a esta:
Exceção: Ocorreu uma exceção não detectada
No código acima, não há bloco "catch", em vez disso, o manipulador de exceção de nível superior é acionado. Esta função deve ser usada para capturar todas as exceções não detectadas.
O código que requer tratamento de exceções deve ser colocado dentro de um bloco try para capturar possíveis exceções.
Cada bloco try ou throw deve ter pelo menos um bloco catch correspondente.
Use vários blocos catch para capturar diferentes tipos de exceções.
Exceções podem ser lançadas (relançadas) em um bloco catch dentro de um bloco try.
Resumindo: se uma exceção for lançada, você deverá capturá-la.