Como capturar um erro fatal do PHP (E_ERROR): armadilhas e soluções

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como capturar um erro fatal do PHP (E_ERROR) e não enlouquecer

\n\n

Você já viu isso? Seu site em PHP exibe uma página branca vazia sem nenhum erro. Ou, pior ainda, — uma mensagem assustadora Fatal error: Uncaught Error.... Se você é um desenvolvedor que trabalha com PHP, já se deparou com E_ERROR — o tipo mais desagradável de erros. Ao contrário de avisos (Warnings) ou notificações (Notices), um erro fatal interrompe completamente a execução do script. E o mais frustrante: o bloco padrão try...catch não o captura.

\n\n

Neste artigo, vamos analisar como capturar corretamente erros fatais do PHP, por que os métodos comuns não funcionam e como tornar seu código mais robusto. Isso não é apenas teoria — escreveremos vários exemplos reais que você poderá aplicar imediatamente em seus projetos.

\n\n

Por que o try...catch não salva do E_ERROR?

\n\n

Vamos acabar com a ilusão imediatamente: try...catch no PHP é projetado para lidar com exceções (Exceptions). E E_ERROR é um erro (Error). São entidades diferentes. O PHP até a versão 7.0 não permitia capturar erros fatais. A partir do PHP 7, surgiu a classe Error, que, assim como Exception, implementa a interface Throwable. Mas isso não significa que qualquer E_ERROR se torne automaticamente uma exceção. Por exemplo, um erro de falta de memória (Out of memory) ou a chamada de um método inexistente ainda são erros fatais que nem sempre podem ser capturados com try...catch.

\n\n

Aqui está um exemplo simples:

\n\n
try {\n    $obj = new NonExistentClass(); // Isso causará um E_ERROR\n} catch (Throwable $e) {\n    echo 'Capturado: ' . $e->getMessage();\n}
\n\n

No PHP 7+, este código funcionará, porque Throwable inclui tanto Error quanto Exception. Mas se o erro ocorrer na fase de compilação (por exemplo, um erro de sintaxe) ou na fase de shutdown — o try...catch é inútil.

\n\n

Top 3 erros fatais do PHP e como evitá-los

\n\n

1. Chamada de método ou classe inexistente

\n\n

O erro fatal mais comum é Call to undefined method ou Class not found. Ele ocorre quando você tenta chamar um método que não existe ou usar uma classe que não foi carregada.

\n\n

Como evitar:

\n
    \n
  • Sempre use o carregamento automático de classes (spl_autoload_register ou Composer).
  • \n
  • Verifique a existência do método com method_exists().
  • \n
\n\n
if (method_exists($object, 'someMethod')) {\n    $object->someMethod();\n} else {\n    // tratamento\n}
\n\n

2. Estouro de memória (Allowed memory size exhausted)

\n\n

O erro Allowed memory size of X bytes exhausted é um erro fatal que ocorre quando o script consome mais memória do que o permitido. Ele não pode ser capturado da maneira comum.

\n\n

Como evitar:

\n
    \n
  • Otimize as consultas ao banco de dados.
  • \n
  • Use geradores (yield) para processar grandes arrays.
  • \n
  • Aumente o limite de memória no php.ini ou através de ini_set('memory_limit', '256M').
  • \n
\n\n

3. Tempo limite de execução excedido (Maximum execution time exceeded)

\n\n

Embora este erro nem sempre seja fatal, em algumas configurações ele interrompe completamente a execução do script.

\n\n

Como evitar:

\n
    \n
  • Use set_time_limit(0) para scripts de longa duração.
  • \n
  • Divida operações pesadas em partes.
  • \n
\n\n

Como capturar um erro fatal do PHP: 3 métodos comprovados

\n\n

Agora vamos ao principal. Existem várias técnicas que permitem capturar E_ERROR e executar código antes que o script morra.

\n\n

Método 1. Usando register_shutdown_function()

Blogs

Book Recommendations