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

Exercícios

  1. 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';.
  2. 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);
  3. 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.
  4. 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
    ?>
  5. 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.