Introdução: Por que o Tratamento de Erros é a Base do Código PHP Confiável
Todo desenvolvedor PHP encontra erros. Seja uma entrada de usuário inválida, um banco de dados indisponível ou uma falha inesperada de API — sem um tratamento de erros adequado, uma aplicação se transforma em uma estrutura frágil que pode "quebrar" a qualquer momento. O tratamento de erros em PHP não é apenas uma forma de evitar a Tela Branca da Morte (WSOD), mas um princípio fundamental para criar aplicações web estáveis, seguras e sustentáveis.
Neste artigo, vamos detalhar todos os aspectos do tratamento de erros em PHP: desde o mecanismo básico try/catch até a criação de exceções personalizadas e estratégias avançadas de registro. Você aprenderá como transformar o caos dos erros em um processo gerenciável e previsível.
Fundamentos: try, catch, finally e throw
O Bloco try/catch — A Primeira Linha de Defesa
O mecanismo de exceção em PHP é baseado na construção try/catch. O código que pode causar um erro é colocado dentro do bloco try. Se uma exceção ocorrer dentro dele, a execução é imediatamente transferida para o bloco catch, onde o erro é tratado.
<?phptry { $file = fopen('important_data.txt', 'r'); if (!$file) { throw new Exception('Falha ao abrir arquivo'); } // Trabalhar com o arquivo fclose($file);} catch (Exception $e) { echo 'Erro: ' . $e->getMessage();}?>É importante entender: nem todos os erros em PHP são exceções. Avisos e notificações padrão não geram exceções automaticamente. Capturá-los requer configuração especial (veja a seção "Técnicas Avançadas").
O Bloco finally — Execução Garantida
O bloco finally sempre executa, independentemente de uma exceção ter sido lançada ou não. Este é o local ideal para liberar recursos: fechar arquivos, conexões de banco de dados ou liberar memória.
<?phpfunction processData($data) { $connection = null; try { $connection = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass'); // Executar consultas return $connection->query($data); } catch (PDOException $e) { // Registrar o erro error_log('Erro no BD: ' . $e->getMessage()); return false; } finally { // Fechar a conexão em qualquer caso if ($connection) { $connection = null; } }}?>A Instrução throw — Criando Suas Próprias Exceções
Usando throw, você pode gerar exceções em qualquer ponto do seu código. Isso permite criar cenários de erro claros e previsíveis.
<?phpfunction validateAge($age) { if (!is_numeric($age)) { throw new InvalidArgumentException('A idade deve ser um número'); } if ($age < 0 || $age > 150) { throw new OutOfRangeException('A idade está fora do intervalo válido'); } return true;}
try { validateAge('abc');} catch (InvalidArgumentException $e) { echo 'Erro de validação: ' . $e->getMessage();} catch (OutOfRangeException $e) { echo 'Intervalo inválido: ' . $e->getMessage();}?>Classes de Exceção Personalizadas
As classes de exceção padrão (Exception, RuntimeException, InvalidArgumentException) cobrem muitos cenários, mas para projetos complexos, é melhor criar suas próprias hierarquias de exceção. Isso melhora a legibilidade do código e simplifica a depuração.
Criando uma Classe de Exceção Personalizada
<?phpclass DatabaseException extends Exception { private $queryString; public function __construct($message, $query = '', $code = 0, Throwable $previous = null) { $this->queryString = $query; parent::__construct($m