English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutorial Básico PHP

Tutorial Avançado PHP

PHP & MySQL

Manual de Referência PHP

Tratamento de Exceções PHP

Neste tutorial, você aprenderá como lançar e capturar exceções no PHP.

O que é exceção

exceções são sinais que indicam a ocorrência de algum evento ou erro anormal. Pode ocorrer por várias razões, como falha na conexão ou consulta ao banco de dados, arquivo que você tentou acessar não existe, etc.

O PHP oferece um mecanismo de tratamento de exceções poderoso, permitindo que você lidar com exceções de maneira elegante. Em comparação com o tradicionaltratamento de errosAo contrário do sistema orientado a objetos, o tratamento de exceções é uma maneira de lidar com errosorientado a objetosO método, que oferece uma forma mais específica e flexível de relatar erros. O modelo de exceção foi introduzido no PHP 5introduzido.

Uso de Throw e Try ... Catch

No método baseado em exceções, o código é escrito dentro de um bloco try, e quando ocorre um evento de exceção durante a execução do código dentro do bloco try, pode-se usar a instrução throw para lançar uma exceção. Em seguida, uma ou mais seções catch a capturam e a interpretam.

O exemplo a seguir demonstra como o tratamento de exceções funciona:

<?php
function division($dividend, $divisor) {
    //Se o divisor for zero, uma exceção será lançada
    if($divisor == 0) {
        throw new Exception('Divisão por zero.');
    } else {
        $quotient = $dividend / $divisor;
        echo "<p>$dividend / $divisor = $quotient </p>";
    }
}
 
try{
    division(10, 2);
    division(30, -4);
    division(15, 0);
    
    //Se uma exceção for lançada, as linhas posteriores não serão executadas
    echo '<p>Todas as operações foram executadas com sucesso.</p>';
} catch(Exception $e){
    //Tratar exceção
    echo "<p>Exceção capturada: " . $e->getMessage() . "</p>";
}
 
// Continuar executando
echo "<p>Hello World!/p>";
?>

Você pode se perguntar do que se trata esse código. Bem, vamos percorrer cada parte do código para entender melhor.

Explicação do uso do código

O sistema de tratamento de exceções do PHP tem quatro partes básicas: try, throw, catch e a classe Exception. A seguir está uma descrição de como cada parte funciona.

  • A função division() do exemplo verifica se o divisor é zero. Se for, lança uma exceção usando a instrução throw do PHP. Caso contrário, essa função realiza a divisão com os números fornecidos e exibe o resultado.

  • Então, no bloco try, chama a função division() com diferentes parâmetros. Se uma exceção for gerada ao executar o código no bloco try, o PHP para a execução no ponto e tenta encontrar um bloco catch correspondente. Se encontrar, executa o código no bloco catch; caso contrário, gera um erro fatal.

  • catch bloco geralmente captura exceções lançadas no bloco try e cria um objeto contendo informações sobre a exceção ($e). Pode-se usar o método getMessage() da exceção para recuperar a mensagem de erro do objeto.

A classe de exceção do PHP também oferece métodos getCode(), getFile(), getLine() e getTraceAsString() para gerar informações de depuração detalhadas.

<?php
//Desativar relatório de erros padrão
error_reporting(0);
 
try{
    $file = "somefile.txt";
    
    //Tentar abrir arquivo
    $handle = fopen($file, "r");
    if(!$handle){
        throw new Exception("Não foi possível abrir o arquivo!", 5);
    }
    
    //Tentar ler conteúdo do arquivo
    $content = fread($handle, filesize($file));
    if(!$content){
        throw new Exception("Não foi possível ler o arquivo!", 10);
    }
    
    //Fechar descritor de arquivo
    fclose($handle);
    
    //Mostrar conteúdo do arquivo
    echo $content;
} catch(Exception $e){
    echo "<h3>Capturou Exceção!/h3>";
    echo "<p>Mensagem de erro: " . $e->getMessage() . "</p>";    
    echo "<p>Arquivo: " . $e->getFile() . "</p>";
    echo "<p>Line: " . $e->getLine() . "</p>";
    echo "<p>Error code: " . $e->getCode() . "</p>";
    echo "<p>Trace: " . $e->getTraceAsString() . "</p>";
}
?>

The constructor of the exception can optionally accept an exception message and an exception code. Although the exception message is usually used to display general information about the cause of the error, the exception code can be used to classify errors. The provided exception code can be retrieved later through the getCode() method of Exception.

Tip:Exceptions should only be used for special cases; they should not be used to specify the normal application flow, such as jumping to another location in the script. This can adversely affect the performance of the application.

Define custom exceptions

You can even define your own custom exception handlers to handle different types of exceptions in different ways. It allows you to use separate catch blocks for each type of exception.
You can define your own custom exceptions by extending the Exception class, as Exception is the base class for all exceptions. Custom exception classes inherit all properties and methods of the PHP Exception class. You can also add custom methods to the custom exception class. Let's look at the following example:

<?php
//Extend the Exception class
class EmptyEmailException extends Exception {}
class InvalidEmailException extends Exception {}
 
$email = "[email protected]";
 
try{
    //If the email is empty, throw an exception
    if($email == "{"
        throw new EmptyEmailException("<p>Please enter your email address!</p>");
    }
    
    //If the email is invalid, throw an exception
    if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {           
        throw new InvalidEmailException("<p><b>$email</b> Not a valid email address!/p>");
    }
    
    // If the email is valid, display a success message
    echo "<p>Success: Email validation successful.</p>";
catch(EmptyEmailException $e){
    echo $e->getMessage();
catch(InvalidEmailException $e){
    echo $e->getMessage();
}
?>

No exemplo acima, derivamos dois novos tipos de exceção a partir da classe base Exception:EmptyEmailExceptioneInvalidEmailException. Múltiplos blocos de captura são usados para exibir mensagens de erro diferentes, dependendo do tipo de exceção gerada.

Como essas classes de exceção personalizadas herdam os atributos e métodos da classe Exception, podemos usar métodos de classe de exceção, como getMessage(), getLine(), getFile(), etc., para recuperar informações de erro do objeto de exceção.

Definir manipulador global de exceção

Como discutido no capítulo anterior, se não for capturada nenhuma exceção, o PHP gera um erro fatal com a mensagem "Uncaught Exception ...". Essa mensagem de erro pode conter informações sensíveis, como o nome do arquivo e o número da linha onde o problema ocorreu. Se não desejar expor essas informações ao usuário, pode criar uma função personalizada e registrá-la na função set_exception_handler() para lidar com todas as exceções não capturadas.

<?php
function handleUncaughtException($e){
    //Exibir mensagem de erro genérica para o usuário
    echo "Ah, algo deu errado. Por favor, tente novamente, se o problema persistir, entre em contato conosco.";
    
    // Construir string de erro
    $error = "Uncaught Exception: " . $message = date("Y-m-d H:i:s - ");
    $error .= $e->getMessage() . " in file " . $e->getFile() . " on line " . $e->getLine() . "\n";
    
    //Registrar detalhes de erro no arquivo
    error_log($error, 3, "var/log/exceptionLog.log");
}
 
//Registrar manipulador de exceção personalizado
set_exception_handler("handleUncaughtException");
 
// Lançar exceção
throw new Exception("Testing Exception!");
?>

Atenção:A exceção não capturada sempre resulta em encerramento do script. Portanto, se desejar que o script continue a executar após o ponto de ocorrência da exceção, cada bloco try deve ter pelo menos um bloco catch correspondente.