Como capturar um erro fatal do PHP (E_ERROR) e não enlouquecer
\n\nVocê 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.
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\nPor que o try...catch não salva do E_ERROR?
\n\nVamos 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.
Aqui está um exemplo simples:
\n\ntry {\n $obj = new NonExistentClass(); // Isso causará um E_ERROR\n} catch (Throwable $e) {\n echo 'Capturado: ' . $e->getMessage();\n}\n\nNo 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.
Top 3 erros fatais do PHP e como evitá-los
\n\n1. Chamada de método ou classe inexistente
\n\nO 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.
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
if (method_exists($object, 'someMethod')) {\n $object->someMethod();\n} else {\n // tratamento\n}\n\n2. Estouro de memória (Allowed memory size exhausted)
\n\nO 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.
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.iniou através deini_set('memory_limit', '256M'). \n
3. Tempo limite de execução excedido (Maximum execution time exceeded)
\n\nEmbora este erro nem sempre seja fatal, em algumas configurações ele interrompe completamente a execução do script.
\n\nComo evitar:
\n- \n
- Use
set_time_limit(0)para scripts de longa duração. \n - Divida operações pesadas em partes. \n
Como capturar um erro fatal do PHP: 3 métodos comprovados
\n\nAgora vamos ao principal. Existem várias técnicas que permitem capturar E_ERROR e executar código antes que o script morra.