Uso de NotImplementedException

15

É uma prática recomendada jogar NotImplementedExceptioncódigo que você ainda não escreveu? Possivelmente os comentários do TODO seriam considerados mais seguros?

Tom Squires
fonte
6
Qual seria a desvantagem de usar essas exceções para você?
SRKX
@SRKX Existe o risco de exceções entrarem no código de produção e fazer com que todo o bloco de códigos não funcione. (Ainda não aconteceu comigo, mas todos temos dias de folga). Eu os uso pessoalmente, fiquei preocupada por ter esquecido algumas das desvantagens.
Tom Squires
Curiosamente, nenhuma das tags especifica qual idioma está sendo usado. Isso não se aplica a todos os idiomas comuns, pois C não possui nenhum tipo de exceção. Há espaço para uma etiqueta de idioma aqui, pessoal.
precisa
1
@ DavidThornley, a pergunta foi originalmente marcada como C #, então li a tag.
precisa
@svick: Pensei que era provavelmente C #. Obrigado por adicionar a tag.
precisa saber é o seguinte

Respostas:

34

Eu acredito que NotImplementedExceptioné realmente uma boa prática.

De fato, se você esquecer de implementar um método e usá-lo mais tarde em seu projeto (e acredite, isso acontece), você poderá passar um longo tempo depurando procurando o que deu errado passo a passo. Se você tiver a exceção, o programa será interrompido diretamente, solicitando a exceção (se você capturar a exceção, você a encontrará rapidamente, observando a exceção que capturou).

Eu recomendaria usar os comentários NotImplementedException combinados com os TODO, para combinar a ajuda da GUI (com as tarefas no VS) e a segurança do programa.

Para a versão de lançamento, é ainda mais importante na minha opinião, pois na maioria dos casos você prefere que seu programa trave ao invés de ter um programa aparentemente funcionando corretamente, mas produzindo resultados errôneos.

SRKX
fonte
6
Se você usar o Resharper, ele mostrará NotImplementedExceptions da mesma maneira que os comentários do TODO. Eu acho que é um bom recurso.
precisa
1
Jogue algumas boas práticas de TDD e você terá um vencedor
LRE
7

Depende da sua filosofia geral sobre erros e manipulação de erros. Eu sou o tipo de cara com "erro grave": lançarei uma exceção ao menor sinal de que algo pode estar errado; Vou afirmar tudo; Se houver um erro, se algo deveria estar lá, e não está, ou se algo está lá, e não deveria, todo o universo deve parar. O som de exclamação das janelas deve soar ameaçadoramente pelos alto-falantes.

Há outras pessoas que preferem não se incomodar com erros. E se o enviarmos para o cliente e todo o módulo de relatórios estiver ausente, porque esquecemos de codificá-lo e ninguém nos testes percebeu isso, porque o aplicativo ficou muito silencioso sobre isso? Melhor não fazer nada, do que lançar uma exceção na cara do cliente!

Mike Nakis
fonte
É como se você desejasse um comportamento diferente no Debug and Release, e uma asserção nem sempre é suficiente. Acredito que os contratos de código .Net podem ser desativados no Release.
Job
1
Uso principalmente asserções, que também são desativadas no lançamento. Eu tenho minha própria função de asserção, que atinge um ponto de interrupção na depuração, lança uma exceção ao testar ou nem mesmo é compilada no lançamento.
Mike Nakis
3

Eu diria que é uma boa ideia. Normalmente, vejo essas exceções geradas pelo código de esqueleto gerado automaticamente a partir de um formulário, diagrama ou algo assim. A exceção me lembra a implementação do código e garante que haverá erros se eu tentar usar a funcionalidade que foi configurada, mas nunca totalmente implementada. Às vezes, eu o removo ou substituo por algo com menor probabilidade de interromper a execução (como imprimir um aviso no console), mas acho que funciona para mim.

Se você estiver criando uma biblioteca que outras pessoas usarão, ter essa exceção é melhor que a alternativa, que seria um usuário da sua biblioteca chamando uma função e se perguntando por que nada parecia acontecer. Obviamente, ainda é muito ruim ter essa exceção em uma biblioteca fornecida, mas é melhor do que falhas silenciosas, IMO.

FrustratedWithFormsDesigner
fonte
1

Eu acho que é uma boa prática. A alternativa é propagar um valor ou estado inválido, o que afetará o código de teste e de produção.

Larry OBrien
fonte
1
Espere ... quer dizer, onde você trabalha, o código que lança o NotImpl faria todo o caminho para o controle de qualidade? Mesmo em produção?
Steven Evers
3
Não, exatamente o oposto: um NotImpl é uma ótima condição de enorme bandeira vermelha / erro. Mas os TODOs não têm valor semântico e podem transformá-lo em teste ou produção, estragando tudo silenciosamente. (Eu poderia imaginar uma política de eliminação TODOs de produção, mas não temos essa regra a.)
Larry OBrien
1

Eu sempre uso NotImplementedException- é para isso, afinal.

Isso está relacionado ao conceito de "falha rápida": se seu código está lançando uma exceção, isso deve ser detectado antes de ir para a produção. Se chegar à produção, pelo menos o cliente saberá que a montagem está incorreta .

Se o código retornar um valor sem sentido ou, para os voidmétodos, não executar nenhuma ação, os consumidores do seu código poderão pensar razoavelmente que a chamada era significativa quando não era. Posteriormente, quando eles obtiverem o código correto, o código poderá ser quebrado porque depende do antigo comportamento incorreto.

phoog
fonte
0

Que tipo de projeto é esse? Trabalho ou casa? Em casa, faça o que quiser - o que melhor lhe lembra que você precisa terminar o que quer que esteja trabalhando.

No trabalho, termine de escrever.

Não consigo ver uma situação em que eu verificaria o código que pode / irá quebrar outros desenvolvedores, controle de qualidade ou uma compilação.

Steven Evers
fonte
Bem, ambos, também tento aderir a boas práticas em casa.
Tom Squires
0

Faço as duas coisas, mas a \ todo, na auto-identificação do doxygene e, em seguida, lanço a exceção. Dessa forma, se as pessoas não puderem se incomodar com o RTFM, pelo menos, serão capazes de descobrir por que seu programa travou, em vez de se perguntar por que há uma função declarada que não está retornando um valor lógico.

awiebe
fonte