Operadores de Controle de Erro
O PHP suporta um operador de controle de erro: o sinal 'arroba' (@
).
Quando ele precede uma expressão em PHP, qualquer mensagem de erro que possa ser
gerada por aquela expressão será ignorada.
Se um manipulador de erro personalizado estiver configurado com set_error_handler(), ele ainda assim será chamado, mesmo com a mensagem de diagnóstico suprimida.
Antes do PHP 8.0.0, error_reporting() chamada dentro de um manipulador de erro
sempre retornava 0
se a mensagem de erro era suprimida pelo operador @
.
Desde o PHP 8.0.0, ele retorna o valor da expressão bitwise dos valores:
E_ERROR | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR | E_PARSE
.
Quaisquer mensages de erro geradas an expressão fica disponível no elemento "message"
do array retornado por error_get_last().
O resultado daquela função irá se alterar em cada erro, então é necessário fazer a verificação imediatamente.
<?php
/* Erro de arquivo intencional */
$my_file = @file ('arquivo_nao_existente') or
die ("Falha abrindo arquivo: erro foi '" . error_get_last()['message'] . "'");
// Isto funciona para qualquer expressão, não apenas para funções:
$value = @$cache[$key];
// você não receberá nenhum aviso se a chave $key não existir.
?>
Note: O operador
@
funciona somente em expressões. Uma regra simples para lembrar disso: se você pode pegar o valor de alguma coisa, você pode prefixar isso com o operador@
. Por exemplo, ele pode prefixar variáveis, chamadas de funções, alguns constructos de linguagem (include), e assim por diante. O operador não pode ser prefixado em definições de classes ou funções, estruturas condicionais comoif
, foreach, e semelhantes.
Antes do PHP 8.0.0, o operador @
conseguia
inibir erros críticos que iriam encerrar a execução do script.
Por exemplo, prefixar @
numa chamada de uma função
inexistente, por estar indisponível ou por erro de digitação, iria
encerrar o script sem nenhuma indicação da causa.