É uma boa prática evitar avisos e avisos?

20

Geralmente, tenho trabalhado com avisos e avisos do PHP desativados, pois trabalho em muitos projetos em que já está em produção ao vivo. Agora, se eu ativar os avisos e avisos nesses sites de produção ao vivo, eles ficarão sobrecarregados.

Nos projetos em que trabalho em casa, no local, geralmente tento resolver TODAS as advertências e avisos. Às vezes, não há solução para não ter um aviso, então eu teria que lidar com o aviso até decidir desativá-los completamente.

No final, não sei se estou perdendo meu tempo tentando me livrar de todos os avisos e avisos, ou se estou realmente fazendo isso para o bem maior.

Daí a minha pergunta, é uma boa prática evitar completamente avisos e avisos, ou isso realmente não importa?

Audite Marlow
fonte
6
"Às vezes, não há solução para não receber um aviso" Já faz um tempo desde que eu usei o PHP, mas não me lembro de encontrar casos em que você poderia evitar o aviso / aviso ou, pelo menos, suprimi-lo localmente@ .
CodesInChaos
27
O argumento mais convincente que já vi é "essas mensagens existem por uma razão - condicionar-nos a ignorar uma enxurrada de avisos nos leva a ignorar problemas reais que podem ter sido evitados". Em outras palavras, se não houver avisos ou avisos durante as operações normais , qualquer aviso ou aviso é sinal de um problema em potencial; se tudo for apenas ruído, você começará a perceber problemas somente depois do SHTF (e provavelmente depois dos clientes).
Piskvor
12
Usar @ para suprimir avisos, embora comum, geralmente é considerado uma coisa ruim. É pior do que simplesmente desligar todos os avisos, porque agora você ocultou um problema em potencial. Em 15 anos de programação php, ainda não encontrei um caso em que tive que suprimir um aviso no código que eu controle.
Cerad 21/01
2
Você está simplesmente desligando a exibição desses avisos ou está fazendo error_reporting(0);? Eu sempre uso error_reporting(E_ALL);e que a única diferença entre desenvolvimento e produção é ini_set('display_errors', 'on');vs ini_set('display_errors', 'off');. Eu sempre pretendo corrigir avisos e avisos enquanto o código ainda está fresco em minha mente. Frequento os logs no meu sistema de produção para ver se há avisos e avisos adicionais que talvez eu tenha esquecido.
MonkeyZeus
1
Concordo plenamente com o que o @Cerad disse @. Após anos e anos de programação PHP, não usei esse operador. Nem uma vez. Nunca. Ele não apenas oculta problemas em potencial, mas também tem um impacto no desempenho: nos bastidores, o PHP desativa o relatório de erros antes de chamar o código -> chama o código -> define de volta ao seu valor original. Essas etapas são caras se você tiver dezenas ou centenas @no seu código.
Radu Murzea 21/01

Respostas:

26

se eu ativar os avisos e avisos nesses sites de produção ao vivo, eles ficarão sobrecarregados.

Você sempre deve ter avisos ativados no nível mais alto em desenvolvimento, teste e controle de qualidade, mas não em produção. Na verdade, se é um aplicativo de dogfood, ou seja, um aplicativo que você usa, também deve ativá-los na produção.

Basicamente: ative-os nos casos em que a pessoa que os vê está em posição de fazer algo sobre eles (o desenvolvedor no desenvolvimento e nos testes pode corrigi-los, o testador no controle de qualidade pode registrar um erro e, se o desenvolvedor estiver também o usuário, ele também pode consertá-lo na produção), mas não ative-o quando a pessoa que vê não puder fazer nada sobre ele (um usuário em produção, que nem sabe programar).

Idealmente, você também deve ativar o tratamento de avisos como erros, mas isso só funciona se não houver nenhum ;-) Mas lembre-se disso como um objetivo! Se for possível ativar / desativar isso por arquivo, ative-o para todos os novos arquivos e ative-o para todos os arquivos sem aviso e nunca desligue-o novamente depois de ligado.

Então, o que fazer com a sobrecarga?

Você faz uma lista de todos os avisos e avisos e segue as seguintes regras:

  1. Nunca, em nenhuma circunstância, adicione um novo aviso à lista. Todo novo trecho de código, toda edição, toda alteração, todo patch, todo commit não deve introduzir novos avisos, ele só pode ser corrigido los.
  2. Sempre que você tocar em um pedaço de código, corrija todos e quaisquer avisos nesse pedaço de código. (A regra do escoteiro: sempre deixe o acampamento em melhores condições do que você o encontrou.) Dessa forma, o código não importante pode ficar cheio de avisos, mas o código importante fica mais limpo com o tempo. "Parte do código" pode ser uma função, uma classe, um arquivo. Você também pode relaxar essa regra para corrigir pelo menos um aviso. O ponto é: conserte-os como você os encontra.

Nota: ambos requerem que você tenha algum tipo de banco de dados de log e mecanismo de filtragem de log em vigor. Observe também que "banco de dados de log" e "mecanismo de filtragem de log" podem ser apenas um arquivo de texto e grep.

Esta é a parte importante. Sem o banco de dados, você não saberá quando adicionar um novo aviso e, sem a filtragem, ainda terá o problema de sobrecarga.

Nota 2: isso não funciona apenas para avisos, mas também para verificadores de estilo, métricas de complexidade, cobertura de código, ferramentas de análise estática e assim por diante. Basicamente:

  1. Não adicione novos problemas.
  2. Corrija os problemas antigos enquanto os tropeça.

Isso permite que você priorize com facilidade: o código que é editado com frequência e, portanto, precisa ser fácil de ler e manter, ficará melhor com o tempo. Código que não é tocado frequentemente, não vai melhorar, mas tudo bem, porque ninguém precisa olhar para ele de qualquer maneira. E , pelo menos, não vai piorar.

Obviamente, nada impede você de alocar tempo especificamente para não fazer nada além de caçar e matar avisos. Frequentemente, isso não é economicamente viável, e é seu trabalho como engenheiro manter isso em mente. "Um engenheiro é aquele que pode construir com um dólar, o que qualquer tolo pode construir com dois."

Jörg W Mittag
fonte
3
Outro ponto por que desativar avisos e erros que chegam ao usuário sem filtragem: por mais informativo que seja um aviso para o desenvolvedor, ele pode vazar informações confidenciais (nomes de arquivos, nomes de outros servidores envolvidos, estrutura de consultas sql usadas, ... )
Hagen von Eitzen
Os avisos na produção devem ir para os logs, não para o usuário! Os erros devem ir para os logs, não para o usuário. Um site que não captura erros, os registra e exibe uma página de erro adequada ao usuário não está pronto para produção. O PHP facilita muito fazer isso errado, mas você ainda deve fazer o certo.
Hbbs
49

Se avisos e avisos vierem do seu código, definitivamente o corrija. Pela minha experiência, em 95% pode ser benigno, mas os 5% destacam um problema real que pode levar a inúmeras horas gastas em perseguição.

Se eles vierem do código de terceiros que você deve usar por um motivo ou outro, geralmente não há muita escolha.

É uma questão diferente se a sua base de código herdada for realmente grande, você poderá tratar o código herdado como terceiros, mas exigir que o novo código seja livre de aviso.

Alexander Pogrebnyak
fonte
8
Eu trabalho em Java / eclipse, que é diferente do php obviamente, mas geralmente acho que o aviso é gerado por 1) algo que compila, mas cometi um erro óbvio ou 2) algo que está bem agora, mas que será ruim no caminho
precisa saber é o seguinte
1
@corsiKa Eu estava traduzindo seu comentário para PHP, mas percebi que apenas uma palavra precisava ser alterada.
Wizzwizz4
3
A menos, claro, esses avisos são de StyleCop sobre o seu pedido de suas usingdeclarações ...
Dan Pantry
12

Importa. Um aviso pode não interromper seus testes ou até aparecer na natureza por um tempo - mas pode ser um sintoma de um bug iminente. Atualmente, desenvolvo principalmente em C # / C ++ e tenho uma estratégia definida para se livrar e manter os avisos fora de nossa base de código. Felizmente, não é ciência do foguete =).

Se o idioma em que você trabalha tem a capacidade de tratar os avisos como erros e tem níveis de aviso variáveis, eu faria o seguinte:

  1. Abaixe o nível de aviso apenas o suficiente para não receber nenhum aviso. Se você estiver no nível de aviso mais baixo e ainda receber avisos - tente corrigi-los. Se você não pode corrigi-los, está pronto por enquanto, mas espero que possa corrigi-los. Ótimo.
  2. Como agora você não possui avisos (provavelmente em um nível de aviso baixo), gire a chave e trate todos os avisos como erros.
  3. Tente aumentar o nível de aviso e corrija todos os novos avisos. Se não conseguir, diminua o nível de aviso, mas não desative os avisos como erros.

Acho que isso não só funciona como avisos do meu código - ele os mantém fora .

PerryC
fonte