Remover mensagens de aviso em PHP

Respostas:

349

Você realmente deve corrigir o que está causando o aviso, mas pode controlar a visibilidade dos erros com error_reporting(). Para pular mensagens de aviso, você pode usar algo como:

error_reporting(E_ERROR | E_PARSE);
Tatu Ulmanen
fonte
53
E_ALL ^ E_WARNING, ativar todos os relatórios de erros, além de avisos, parece ser uma opção melhor para argumentar error_reporting.
precisa
1
geralmente concordo, no meu caso, gerar a mensagem de aviso era um comportamento pretendido, porque fazia parte dos meus testes de unidade.
precisa saber é o seguinte
121

Você pode colocar um @ na frente da sua chamada de função para suprimir todas as mensagens de erro.

@yourFunctionHere();
PetPaulsen
fonte
4
Isso apenas oculta o erro, ainda está acontecendo. Os erros tornam o PHP mais lento, por isso é melhor corrigir o erro, se possível. O uso de @ reduz a velocidade do código quando não há erro. vega.rd.no/articles/php-performance-error-suppression
dprevite
46
Às vezes (infelizmente) você realmente não tem escolha. Por exemplo, a função PHP parse_url () gera avisos para URLs "gravemente malformados" - o que é sem dúvida um bug, pois a função retorna false nesse caso. Portanto, você deve tolerar esses avisos do PHP na saída do programa (pode ser inaceitável para aplicativos analisador / validador), suprimir os avisos de alguma forma ou solucionar o comportamento quebrado do PHP escrevendo seu próprio analisador / validador para URLs. Nesse caso, eu escolho o @.
Peter
1
IMPORTANTE: Use este método se (1) você não puder corrigir o problema que gera o aviso nem (2) ocultar seus avisos dos usuários finais via php error_reporting ... Ocultar avisos de seus desenvolvedores NÃO é uma solução.
Joshua Kissoon
3
Deixe-me explicar por que isso é crítico. Algumas funções como dns_get_recordlançarão avisos. Seu código pode compensar o aviso, mas ainda o lança. Desativar o relatório de erros funciona no servidor de produção, mas não no servidor de desenvolvimento. Se você estiver gerando conteúdo XML, o aviso fará com que o navegador não seja renderizado porque o servidor está enviando XML malformado causado pelo aviso. Às vezes, você quer isso em desenvolvimento, mas não por algo causado por uma falha temporária na pesquisa de DNS que você já compensa.
Alice Wonder
2
Deixe-me explicar por que isso é útil, quando, em vez de todas as mensagens de aviso, é você quem quer lidar com o aviso como um erro e gerar sua própria mensagem de erro
Daniel N.
43

Para suprimir avisos e deixar todos os outros relatórios de erros ativados:

error_reporting(E_ALL ^ E_WARNING); 
Karthik
fonte
28

Se você não deseja mostrar avisos e erros, use

// Turn off all error reporting
error_reporting(0);

Relatório de Erros - Manual do PHP

mohan.gade
fonte
18

Se você deseja suprimir os avisos e alguns outros tipos de erro (por exemplo, avisos) enquanto exibe todos os outros erros, é possível:

error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
zstate
fonte
15

no Core Php para ocultar o conjunto de mensagens de aviso error_reporting (0) na parte superior do arquivo de inclusão comum ou arquivo individual.

No Wordpress ocultar Avisos e avisos, adicione o seguinte código no arquivo wp-config.php

ini_set('log_errors','On');
ini_set('display_errors','Off');
ini_set('error_reporting', E_ALL );
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
Vijay Lathiya
fonte
Esta é a melhor solução, quando se trata de ocultar logs no Wordpress. Obrigado!!
Neo Morina
10

Não estou respondendo exatamente à pergunta, mas acho que esse é um compromisso melhor em algumas situações:

Eu recebi uma mensagem de aviso como resultado de uma instrução printf () em uma biblioteca de terceiros. Eu sabia exatamente qual era a causa - uma solução temporária enquanto os terceiros corrigiam seu código. Concordo que os avisos não devem ser suprimidos, mas não pude demonstrar meu trabalho a um cliente com a mensagem de aviso aparecendo na tela. Minha solução:

printf('<div style="display:none">');
    ...Third-party stuff here...
printf('</div>');

O aviso ainda estava na fonte da página como um lembrete para mim, mas invisível para o cliente.

DaveWalley
fonte
5
Pessoalmente, eu uso ob_start()e ob_end_clean()em vez disso. Dessa forma, o material nem é enviado ao navegador (o que ocorre aqui).
H2ooooooo
6
Por isso, incluí "algumas situações", "avisos não devem ser suprimidos" e "lembrete para mim".
DaveWalley
1
Antes de me votar mais, leia minha resposta. Observe "de terceiros", "compromisso" e o comentário acima. Eu adicionei esta resposta caso outra pessoa estivesse na mesma situação em que eu estava, e nessa situação específica, isso me salvou, enquanto todas as outras respostas não teriam sido tão boas. Na próxima vez, pensarei duas vezes em ser útil.
#
Obrigado por não remover essa idéia brilhante. No meu sistema, eu salvo todos os erros e avisos enviados de volta pelos clientes e, quando um administrador efetua login, eles são imediatamente alertados sobre qualquer atividade para que possam aconselhar a equipe de manutenção. O site é para jogos educacionais, por isso não é nada demais se algo der errado por uma hora ou mais.
precisa saber é o seguinte
8

Eu faço isso da seguinte maneira no meu php.ini :

error_reporting = E_ALL & ~E_WARNING  & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

Isso registra apenas erros fatais e nenhum aviso.

navid
fonte
7

Eu acho que a melhor solução é a configuração do .htaccess. Dessa forma, você não precisa alterar o código do aplicativo. Aqui estão as diretrizes para o Apache2

php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_value docref_root 0
php_value docref_ext 0
Sebastian Piskorski
fonte
7

Você pode suprimir o aviso usando error_reporting, mas a melhor maneira é corrigir o script em primeiro lugar.

Se você não souber como, edite sua pergunta e mostre-nos a linha em questão e o aviso exibido.

Pekka
fonte
7
Safaali, você deve corrigir os problemas, e não ignorá-los.
Sampson
2
Safaali, como você tem algum interesse em PHP, faça um favor a si mesmo e procure consertar esse script.
Pekka 01/01
0

Já existe uma resposta com o Operador de controle de erros, mas falta explicação. Você pode usar o @operador com todas as expressões e oculta erros (exceto Erros Fatais).

@$test['test']; //PHP Notice:  Undefined variable: test

@(14/0); // PHP Warning:  Division by zero

//This is not working. You can't hide Fatal Errors this way.
@customFuntion(); // PHP Fatal error:  Uncaught Error: Call to undefined function customFuntion()

Para depuração, é um método rápido e perfeito. Mas você nunca deve usá-lo na produção nem incluir permanentemente na sua versão local. Isso lhe dará muita irritação desnecessária.

Você deve considerar:

1. Erro ao relatar as configurações conforme mencionado na resposta aceita.

error_reporting(E_ERROR | E_PARSE);

ou das configurações do PHP INI

ini_set('display_errors','Off');

2. Capturando exceções

try {
    $var->method();
} catch (Error $e) {
    // Handle error
    echo $e->getMessage();
}
Tajni
fonte
0

Para ignorar todos os avisos, use este exemplo, na parte superior do seu código:

error_reporting(0);
Ada
fonte
E qual é a diferença da sua resposta com a resposta aceita?
endo64