English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste tutorial, você aprenderá como lançar e capturar exceções no PHP.
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.
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.
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.
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.
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.