Erros vs exceções
Nesta aula, você aprenderá a diferença entre erros e exceções em PHP, os principais tipos e níveis de erro (como E_WARNING e E_ERROR), como configurar a diretiva error_reporting para controlar quais erros são reportados e como usar display_errors para exibir ou ocultar erros na saída. O conteúdo inclui exemplos práticos, boas práticas e exercícios para fixação.
Em PHP, erros e exceções são mecanismos distintos para lidar com problemas durante a execução. Enquanto exceções são objetos lançados intencionalmente e capturados com try/catch, erros são eventos mais antigos e tradicionais que podem ser gerados pelo interpretador ou pelo programador. Compreender essa diferença é fundamental para escrever código robusto e debugar aplicações com eficiência.
Nesta aula, vamos explorar os tipos de erro, os níveis de severidade (como E_WARNING, E_NOTICE, E_ERROR), as diretivas error_reporting e display_errors, e como configurar o ambiente para desenvolvimento e produção.
Tipos de erro
Em PHP, os erros são classificados em três categorias principais: erros fatais (fatal errors), erros de aviso (warnings) e avisos (notices). Erros fatais interrompem a execução do script; warnings indicam problemas que podem não impedir a execução, mas merecem atenção; notices são avisos menores, geralmente sobre código não ideal.
Além disso, existem erros de análise (parse errors) que ocorrem antes da execução, e erros de usuário, gerados com trigger_error(). A tabela de constantes de erro define o nível de severidade.
<?php
// Exemplo de erro fatal: chamar função inexistente
// undef_func(); // Fatal error: Call to undefined function
// Exemplo de warning: incluir arquivo inexistente
include 'arquivo_inexistente.php'; // Warning: include(): Failed opening
// Exemplo de notice: usar variável não definida
echo $varNaoDefinida; // Notice: Undefined variable
?>Níveis (E_WARNING, etc.)
O PHP define constantes para representar os níveis de erro. As principais são:
- E_ERROR (1): Erro fatal que interrompe o script.
- E_WARNING (2): Aviso não fatal.
- E_PARSE (4): Erro de sintaxe.
- E_NOTICE (8): Aviso de uso não ideal (ex.: variável não definida).
- E_CORE_ERROR (16): Erro fatal na inicialização do PHP.
- E_CORE_WARNING (32): Aviso na inicialização.
- E_COMPILE_ERROR (64): Erro fatal de compilação.
- E_COMPILE_WARNING (128): Aviso de compilação.
- E_USER_ERROR (256): Erro gerado pelo usuário com trigger_error().
- E_USER_WARNING (512): Aviso gerado pelo usuário.
- E_USER_NOTICE (1024): Notice gerado pelo usuário.
- E_STRICT (2048): Sugestões de boas práticas (desde PHP 5).
- E_RECOVERABLE_ERROR (4096): Erro fatal que pode ser capturado.
- E_DEPRECATED (8192): Aviso de funcionalidade obsoleta.
- E_USER_DEPRECATED (16384): Deprecated gerado pelo usuário.
- E_ALL (30719): Todos os erros e avisos (exceto E_STRICT antes do PHP 8.0).
Os níveis podem ser combinados com operadores bitwise (|, &). Por exemplo, error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING) reporta todos os erros exceto notices e warnings.
<?php
// Configurar para reportar apenas erros fatais e warnings
error_reporting(E_ERROR | E_WARNING);
// Gerar um warning
trigger_error('Este é um warning', E_USER_WARNING);
?>error_reporting
A diretiva error_reporting define quais níveis de erro serão reportados pelo PHP. Ela pode ser configurada no php.ini, no .htaccess ou em tempo de execução com a função error_reporting(). O valor é um inteiro que representa uma máscara de bits.
Em desenvolvimento, é recomendado usar E_ALL para capturar todos os erros. Em produção, costuma-se usar E_ALL & ~E_DEPRECATED & ~E_STRICT (ou apenas E_ALL, dependendo da versão).
<?php
// Em desenvolvimento:
error_reporting(E_ALL);
// Em produção (oculta notices e deprecated):
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
// Verificar valor atual
echo error_reporting(); // exibe o valor inteiro
?>display_errors
A diretiva display_errors controla se os erros são exibidos na saída padrão (tela) ou não. Em desenvolvimento, geralmente é ligada (On); em produção, desligada (Off) para evitar vazamento de informações sensíveis.
Ela pode ser configurada no php.ini, .htaccess ou via ini_set(). Quando desligada, os erros ainda podem ser logados no arquivo de log do servidor (se log_errors estiver ativo).
<?php
// Ativar exibição de erros (apenas para desenvolvimento)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// Em produção, desative:
// ini_set('display_errors', 0);
?>É importante notar que display_errors e error_reporting trabalham juntos: error_reporting define quais erros são reportados; display_errors decide se esses erros são exibidos. Se um erro não está no escopo de error_reporting, ele não será exibido mesmo com display_errors ativo.
Boas práticas
- Nunca deixe display_errors ativo em produção; use log_errors para registrar erros.
- Configure error_reporting para E_ALL durante o desenvolvimento para capturar todos os problemas.
- Use trigger_error() para gerar erros personalizados, especialmente em bibliotecas.
- Considere usar o operador @ para suprimir erros, mas com moderação (pode mascarar problemas).
- Em código moderno, prefira exceções a erros tradicionais, pois são mais flexíveis e orientadas a objetos.
Referências
- PHP: Constantes de erro - Manual
- PHP: error_reporting - Manual
- PHP: display_errors - Manual
- PHP: trigger_error - Manual
- PHP: Exceções - Manual
Exercícios
Qual é a diferença entre um erro fatal (E_ERROR) e um warning (E_WARNING)? Dê um exemplo de cada.
✓ Resposta: Um erro fatal (E_ERROR) interrompe a execução do script imediatamente, como chamar uma função indefinida. Um warning (E_WARNING) não interrompe a execução, apenas exibe um aviso, como incluir um arquivo inexistente. Exemplo de fatal:undef_func();; exemplo de warning:include 'nao_existe.php';.Como você configuraria o PHP para reportar todos os erros, exceto notices e depreciações? Escreva o código.
✓ Resposta:error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);Explique a relação entre as diretivas error_reporting e display_errors. É possível exibir erros mesmo se error_reporting estiver configurado para 0?
✓ Resposta: error_reporting define quais erros são reportados (ou seja, gerados internamente). display_errors controla se esses erros reportados são exibidos na saída. Se error_reporting for 0, nenhum erro é reportado, então mesmo com display_errors=On, nenhum erro será exibido.Escreva um código que gera um erro do tipo E_USER_WARNING usando trigger_error() e, em seguida, configura o PHP para não exibir warnings na tela.
✓ Resposta:<?php // Gerar warning trigger_error('Meu warning', E_USER_WARNING); // Configurar para não exibir warnings (mas ainda reportá-los) ini_set('display_errors', 0); error_reporting(E_ALL); // continua reportando, mas não exibe ?>Qual é a máscara de bits para E_ERROR | E_WARNING | E_PARSE? Calcule o valor inteiro.
✓ Resposta: E_ERROR = 1, E_WARNING = 2, E_PARSE = 4. A combinação usando OR bitwise é 1 | 2 | 4 = 7. Portanto, o valor inteiro é 7.