Erro PHP
Aprenda os níveis de erro do PHP, a diferença entre erros e exceções, e como configurar relatórios e tratamento de erros de forma eficaz.
Encontrar erros é uma parte normal da programação em PHP. Quanto mais rápido você conseguir ler um erro e entender qual é o nível, por que o PHP o gerou e como responder, mais rápido você entrega um código funcional. Esta página explica os níveis de erro do PHP (as constantes E_*), a diferença entre erros e exceções no PHP moderno, e um fluxo de trabalho prático para relatórios, registro e tratamento de erros.
Níveis de Erro do PHP
Quando o PHP detecta um problema, ele o levanta em um nível específico, identificado por uma constante E_*. O nível indica a gravidade do problema e se o script continua em execução. Você combina essas constantes com error_reporting() e a diretiva error_reporting do php.ini para decidir quais níveis são exibidos ou registrados.
| Constante | Interrompe o script? | Significado |
|---|---|---|
E_ERROR | Sim | Erro fatal em tempo de execução, por exemplo, chamar uma função indefinida. |
E_WARNING | Não | Aviso em tempo de execução, por exemplo, include de um arquivo ausente. |
E_PARSE | Sim | Erro de sintaxe em tempo de compilação; o arquivo nunca é executado. |
E_NOTICE | Não | Problema menor, por exemplo, leitura de uma variável indefinida. |
E_DEPRECATED | Não | O recurso ainda funciona, mas será removido em uma versão futura. |
E_USER_ERROR / E_USER_WARNING / E_USER_NOTICE | Varia | Níveis que você gera com trigger_error(). |
E_STRICT | Não | Sugestões para código compatível com versões futuras (incorporado ao E_ALL desde o PHP 7). |
E_ALL | — | Máscara de bits que habilita todos os níveis — use em desenvolvimento. |
Estas são constantes de máscara de bits, portanto, você as combina com o operador OR bit a bit (|) e exclui níveis com & mais ~:
<?php
// Report everything except notices and deprecations
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);Importante: Desde o PHP 8.0, muitos antigos warnings e notices foram promovidos a exceções
Errorlançadas (por exemplo, ler uma chave de array indefinida agora gera um aviso, enquanto chamar um método indefinido lança umError). Saber se um problema é um erro gerado ou uma exceção lançada determina como você o captura — veja abaixo.
Erros vs. Exceções
O PHP possui dois mecanismos relacionados, mas distintos:
- Erros tradicionais são gerados pelo motor e roteados por
error_reporting,display_errorse um manipulador opcional definido comset_error_handler(). Eles não são objetos que você pode capturar comcatch(a menos que seu manipulador os converta). - Exceções são objetos que você
throwecatchcom blocostry/catch. Desde o PHP 7, problemas fatais do motor também são lançados como objetosError(comoTypeErrorouDivisionByZeroError), e tantoExceptionquantoErrorimplementam a interfaceThrowable— portanto,catch (\Throwable $e)captura qualquer coisa que possa ser capturada.
<?php
try {
// intdiv() throws a DivisionByZeroError on division by zero
echo intdiv(10, 0);
} catch (\Throwable $e) {
echo get_class($e) . ": " . $e->getMessage();
}
// Output: DivisionByZeroError: Division by zeroCausas Comuns de Erros PHP
A maioria dos erros se origina de um pequeno conjunto de causas:
- Erros de sintaxe — um ponto e vírgula ausente ou um colchete sem par (
E_PARSE). - Símbolos indefinidos — usar uma variável, constante, função ou chave de array que não existe.
- Incompatibilidade de tipos — passar o tipo errado para um parâmetro tipado (lança
TypeError). - Recursos obsoletos — funções ou sintaxe programadas para remoção (
E_DEPRECATED). - Limites de recursos — esgotar
memory_limitou atingirmax_execution_time. - Falhas externas — um arquivo ausente, ou uma conexão com banco de dados/API que recusa ou expira.
- Exceções não capturadas — um
throwsem nenhumcatchcorrespondente, o que se torna um erro fatal.
<?php
// Reading an undefined variable raises an E_WARNING and yields null
echo $undefined_variable ?? "fallback";
// Output: fallbackO operador null-coalescing (??) acima é a forma idiomática de ler um valor que pode ser indefinido sem acionar um aviso.
Configurando o Relatório de Erros
Controle quais níveis aparecem e para onde vão. Em desenvolvimento, exiba tudo; em produção, oculte os erros dos usuários, mas registre-os.
<?php
// Development: show all errors on screen
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Production: hide from users, write to the error log instead
// error_reporting(E_ALL);
// ini_set('display_errors', '0');
// ini_set('log_errors', '1');As configurações equivalentes no php.ini são error_reporting, display_errors, log_errors e error_log. Para controle programático, consulte error_reporting() e, para inspecionar o erro mais recente, use error_get_last().
Tratamento de Erros no Código
Há três ferramentas complementares:
1. Capture exceções com try/catch para que uma falha recuperável não cause a interrupção do script:
<?php
function safeDivide(int $a, int $b): float
{
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero");
}
return $a / $b;
}
try {
echo safeDivide(10, 0);
} catch (InvalidArgumentException $e) {
echo "Handled: " . $e->getMessage();
}
// Output: Handled: Cannot divide by zero2. Instale um manipulador de erros personalizado com set_error_handler() para converter erros tradicionais em exceções ou para registrá-los no seu próprio formato:
<?php
set_error_handler(function (int $level, string $message, string $file, int $line) {
// Turn a traditional warning/notice into an ErrorException so it can be caught
throw new ErrorException($message, 0, $level, $file, $line);
});
try {
// Reading a missing file raises an E_WARNING, now converted to an exception
$contents = file_get_contents('/no/such/file.txt');
} catch (\Throwable $e) {
echo "Caught: " . $e->getMessage();
}
// Output: Caught: file_get_contents(/no/such/file.txt): Failed to open stream: No such file or directory3. Dispare seus próprios erros com trigger_error() para sinalizar problemas no nível da aplicação pelo mesmo pipeline dos erros do motor.
Boas Práticas
- Defina
display_errorscomo0em produção — rastreamentos de pilha expostos são um risco de segurança. Uselog_errorse umerror_logconfigurado. - Desenvolva com
error_reporting(E_ALL)para que avisos e recursos obsoletos apareçam cedo. - Prefira
catch (\Throwable $e)no nível superior para capturar tantoExceptionquantoError. - Nunca silencie problemas com o operador
@; corrija a causa ou trate-a explicitamente. - Centralize o registro com
error_log()para que todas as falhas sejam registradas em um único lugar.
Conclusão
Ler um erro PHP começa com seu nível e verificar se é um erro gerado ou uma exceção lançada. Com error_reporting() ajustado por ambiente, um manipulador personalizado que encaminha erros para o sistema de exceções e try/catch ao redor do código que pode falhar, você diagnostica problemas rapidamente e mantém a produção resiliente. Continue com PHP Exceptions e error_reporting() para se aprofundar.