Pergunta

A maior parte do tempo eu uso uma exceção para verificar se uma condição no meu código, eu me pergunto quando é o momento apropriado para usar uma declaração?

Por exemplo,

Group group=null;
try{
    group = service().getGroup("abc");
}catch(Exception e){
    //I dont log error because I know whenever error occur mean group not found
}

if(group !=null)
{
    //do something
}

Você poderia indicar como uma afirmação se encaixa aqui?Devo usar uma declaração?

Parece que eu nunca use afirmações, no código de produção e ver apenas as afirmações em testes de unidade.Eu sei que na maioria dos casos, se pode usar a exceção para fazer a verificação de como o acima, mas eu quero saber a maneira adequada de fazer isso "profissionalmente".

Foi útil?

Solução

As afirmações devem ser usadas para verificar algo que nunca deve acontecer, enquanto uma exceção deve ser usada para verificar algo que pode acontecer.

Por exemplo, uma função pode se dividir por 0, portanto, uma exceção deve ser usada, mas uma afirmação pode ser usada para verificar se o harddrive desaparece de repente.

Uma afirmação impediria a execução do programa, mas uma exceção permitiria que o programa continuasse em execução.

Observe que if(group != null) não é uma afirmação, isso é apenas um condicional.

Outras dicas

Fora da minha mente (lista pode estar incompleta, e é muito longo para caber em um comentário), eu gostaria de dizer:

  • use exceções quando a verificação de parâmetros passados para o público ou protegido métodos e construtores
  • use exceções ao interagir com o usuário, ou quando você espera que o código do cliente para recuperar de uma situação excepcional
  • usar exceções para resolver os problemas que podem ocorrer
  • use afirmações quando a verificação de pré-condições, pós-condições e invariantes do privado/código interno
  • use afirmações para fornecer feedback para si mesmo ou sua equipe de desenvolvedores
  • use afirmações quando a verificação de coisas que estão muito improvável que isso aconteça, caso contrário significa que há uma falha grave na sua aplicação
  • use afirmações para o estado de coisas que você (supostamente) sabemos ser verdade

Em outras palavras, exceções endereço a robustez de sua aplicação enquanto afirmações endereço de sua correção.

Afirmações são projetados para ser mais baratos para escrever, você pode usá-los quase em todo o lado e eu estou usando esta regra de ouro:mais uma declaração declaração parece estúpido, o mais valioso é e mais informações de que ele incorpora.Quando a depuração de um programa que não se comportam da maneira certa, você certamente irá verificar a mais óbvia falha de possibilidades com base na sua experiência.Em seguida, você irá verificar problemas que não podem acontecer:este é exatamente quando asserções ajuda muito e economizar tempo.

Lembre -se de que as afirmações podem ser desativadas em tempo de execução usando parâmetros e são desativados por padrão, então não conte com eles, exceto para fins de depuração.

Também você deve ler o Artigo do Oracle sobre afirmação Para ver mais casos onde usar - ou não usar - afirmar.

Como regra geral:

  • Use afirmações para verificações de consistência interna, onde não importa se alguém liga-los fora.(Observe que o java comando desativa todas as afirmações por padrão.)
  • O uso de testes regulares para qualquer tipo de verifica o que não deve ser desligada.Este inclui defensiva verifica que a guarda contra potenciais danos provocados por insetos, e qualquer validação de dados / pedidos / whatever fornecidas pelos usuários ou serviços externos.

O seguinte código a partir de sua pergunta é mau estilo e potencialmente buggy

try {
    group = service().getGroup("abc");
} catch (Exception e) {
    //i dont log error because i know whenever error occur mean group not found
}

O problema é que você NÃO sabe que uma exceção significa que o grupo não foi encontrado.Também é possível que o service() chamada emitiu uma exceção, ou que ele voltou null o que fez com que um NullPointerException.

Quando você pegar um "esperado" de exceção, você deve pegar apenas a exceção que você está esperando.Por captura de java.lang.Exception (e, especialmente, por não se efectuar o registo é), você está se tornando mais difícil de diagnosticar / depurar o problema, e, potencialmente, permitir que o aplicativo para fazer mais danos.

De acordo com este documento http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#design-daq-general, "A declaração assert é apropriada para a pré -condição não pública, pós -condição e verificação invariável da classe.

Se você quiser saber mais sobre pré -condição, pós -condição e invariante em classe, verifique este documento: http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#usage-conditions. Ele também contém com exemplos de uso de afirmações.

Bem, de volta à Microsoft, a recomendação era lançar exceções em todas as APIs que você disponibilizar publicamente e usar as afirmações em todos os tipos de suposições que você faz sobre o código interno. É uma definição um pouco frouxa, mas acho que cabe a cada desenvolvedor desenhar a linha.

Em relação ao uso de exceções, como diz o nome, seu uso deve ser excepcional, portanto, para o código que você apresenta acima, o getGroup a chamada deve retornar null Se não houver serviço. A exceção só deve ocorrer se um link de rede cair ou algo assim.

Eu acho que a conclusão é que é um pouco deixado à equipe de desenvolvimento para cada aplicativo definir os limites da afirmação versus exceções.

Testar o NULL só pegará nulos causando problemas, enquanto uma tentativa/captura como você algum erro.

Em termos gerais, tente/capturar é mais seguro, mas um pouco mais lento, e você deve ter cuidado para que você pegue todos os tipos de erro que podem ocorrer. Então, eu diria que use Try/Catch - um dia o código GetGroup pode mudar, e você pode precisar dessa rede maior.

Você pode usar essa simples diferença em mente enquanto o uso deles. Exceções serão usadas para verificar erros esperados e inesperados chamados erros verificados e desmarcados, enquanto a afirmação é usada principalmente para fins de depuração no tempo de execução para ver se as suposições são validadas ou não.

Confesso que estou um pouco confuso com sua pergunta. Quando uma condição de afirmação não é atendida, uma exceção é lançada. Confusadamente isso é chamado AssertionError. Observe que está desmarcado, como (por exemplo) Exceção de argumento ilegal que é jogado em circunstâncias muito semelhantes.

Então, usando afirmações em java

  1. é um meio mais conciso de escrever um bloco de condição/arremesso
  2. Permite que você ative essas verificações ligadas/desativado por meio de parâmetros JVM. Normalmente, eu deixava essas verificações o tempo todo, a menos que elas impactassem o desempenho do tempo de execução ou tenham uma penalidade semelhante.

Consulte a Seção 6.1.2 (afirmações versus outro código de erro) da documentação do Sun no link a seguir.

http://www.oracle.com/technetwork/articles/javase/javapch06.pdf

Este documento oferece os melhores conselhos que já vi sobre quando usar as afirmações. Citando do documento:

"Uma boa regra geral é que você deve usar uma afirmação para casos excepcionais que gostaria de esquecer. Uma afirmação é a maneira mais rápida de lidar e esquecer Lide com."

Infelizmente as afirmam que podem ser desativadas. Quando em produção você precisa de toda a ajuda que pode obter ao rastrear algo imprevisto, então afirma se desqualificar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top