Como funciona o tratamento de erros e exceções em PHP?
sobes.tech IA
Resposta da IA
O tratamento de erros e exceções em PHP permite controlar a execução do programa em situações incorretas, evitar falhas fatais e fornecer informações significativas ao utilizador.
Erros
Os erros são problemas que ocorrem ao nível do interpretador PHP. Podem ser sintáticos, lógicos ou surgir ao aceder a recursos inexistentes. Os níveis de erro são determinados por constantes (E_ERROR, E_WARNING, E_NOTICE, etc.) e podem ser configurados com error_reporting e display_errors.
Para tratar erros, utilizam-se funções personalizadas registadas com set_error_handler(). Esta função intercepta erros (exceto E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING), permitindo registá-los, mostrar uma mensagem, parar a execução do script ou continuar.
<?php
// Função personalizada de tratamento de erros
function myErrorHandler($errno, $errstr, $errfile, $errline) {
// Registo do erro
error_log("Erro [$errno]: $errstr no ficheiro $errfile na linha $errline");
// Mostrar mensagem ao utilizador (dependendo do ambiente)
if (ini_get('display_errors')) {
echo "Ocorreu um erro: [$errno] $errstr<br>";
echo "No ficheiro: $errfile na linha: $errline<br>";
}
// Parar a execução em erros críticos
if ($errno == E_USER_ERROR) {
die("Erro crítico. Script parado.");
}
// Continuar com o tratamento padrão do PHP se a função retornar false
// return false;
}
// Registar a função tratadora
set_error_handler("myErrorHandler");
// Exemplo de erro
// echo $undeclaredVar; // Vai gerar E_NOTICE
Exceções
As exceções são objetos que são lançados em situações excecionais. Permitem estruturar o código e gerir o fluxo de execução de forma mais flexível do que o tratamento tradicional de erros.
São tratadas com a construção try...catch...finally:
try: Bloco de código onde pode ocorrer uma exceção.catch: Bloco que é executado se notryou noutrocatchfor lançada uma exceção do tipo especificado. Pode usar múltiploscatchpara diferentes tipos.finally: (disponível desde PHP 5.5) Bloco que sempre é executado, independentemente de uma exceção ter sido lançada ou não e se foi capturada.
<?php
function divide($a, $b) {
if ($b === 0) {
throw new Exception("Divisão por zero impossível.");
}
return $a / $b;
}
try {
echo divide(10, 2) . "<br>";
echo divide(5, 0) . "<br>"; // Uma exceção será gerada
echo "Este código não será executado se a linha anterior lançar uma exceção.";
} catch (Exception $e) {
echo "Exceção capturada: " . $e->getMessage() . "<br>";
// Pode também obter o ficheiro, a linha e a pilha de chamadas
// echo "No ficheiro: " . $e->getFile() . " na linha: " . $e->getLine() . "<br>";
// echo "Stack trace:<pre>" . $e->getTraceAsString() . "</pre>";
} finally {
// Este bloco é sempre executado
echo "Operação concluída.<br>";
}
Classes de exceções
O PHP fornece a classe base Exception, da qual herdam outras classes de exceções incorporadas (por exemplo, InvalidArgumentException, RuntimeException). Pode criar classes próprias de exceções, herdando de Exception ou seus descendentes, para uma representação mais precisa dos tipos de erros.
<?php
class MyCustomException extends Exception {
// Pode adicionar propriedades e métodos próprios
}
function processData($data) {
if (empty($data)) {
// Lançar exceção personalizada
throw new MyCustomException("Dados para processamento ausentes.");
}
// ... processamento de dados
}
try {
processData([]);
} catch (MyCustomException $e) {
echo "Exceção personalizada capturada: " . $e->getMessage() . "<br>";
} catch (Exception $e) {
echo "Outra exceção capturada: " . $e->getMessage() . "<br>";
}
Princípios gerais
- Não capture erros que não pode tratar. Se não souber como reagir corretamente a um erro, deixe-o subir para ser tratado por outro manipulador.
- As exceções são melhores para situações esperadas mas excecionais (por exemplo, erro de entrada do utilizador, impossibilidade de conectar à base de dados). Os erros geralmente indicam problemas no próprio código ou ambiente.
- Registe erros e exceções. Isto é fundamental para depuração e monitorização da aplicação.
- Não revele informações sensíveis ao utilizador em mensagens de erro.
- Use
set_exception_handler()para tratar exceções não capturadas. Isto ajuda a evitar erros fatais e a degradação graciosa.
<?php
// Manipulador de exceções não capturadas
function myExceptionHandler($exception) {
error_log("Exceção não capturada: " . $exception->getMessage());
// Redirecionar para página de erro, mostrar mensagem geral, etc.
echo "Ocorreu um erro inesperado no servidor. Tente novamente mais tarde.";
}
set_exception_handler('myExceptionHandler');
// Este código lançará uma exceção que será capturada por myExceptionHandler
// throw new Exception("Isto não é uma exceção capturada.");
Assim, o uso adequado dos mecanismos de tratamento de erros e exceções é fundamental para criar aplicações PHP confiáveis e de fácil manutenção.