Como você atribui códigos de erro?


13

Como, ao desenvolver um projeto de tamanho médio, você identifica, cria e mantém códigos de erro?

Pela minha vida, não consigo pensar em um método simples e limpo de fazê-lo. Algumas de minhas idéias convertem nomes de classes e nomes de métodos em uma sequência inteira, mas essa é uma maneira longa de exibir para o usuário, além do fato de que nomes de métodos e nomes de classes podem mudar (espero que não!). Outros estão apenas usando um sistema de log incrementado (ou seja, sempre que eu criar uma nova mensagem de erro, basta adicionar 1 ao último ID da mensagem de erro). Mas isso é completamente desorganizado.

Para ser mais específico, estou falando de código de erro, como:

Error 401 Unauthorized.


1
códigos de erro? Como "números mágicos"? Por exemplo ... ERRO 001. Então você vai para uma lista e lê ERRO 001 significa que bla bla bla ... Sim?
wleao

@wleao - Yessir. Vou editar minha pergunta para incluir isso. Obrigado.
ahodder


Como você editou na sua pergunta. Veja como eles fazem isso com http. Não sei se é uma boa ideia usar números mágicos. No entanto, se você estiver realmente disposto a fazê-lo, siga os conceitos deles. Por exemplo, eles têm uma taxonomia de erros (você tem isso?).
wleao

@ wleao - ainda não, mas graças a você e a Péter Török, definitivamente criaremos um. :)
ahodder

Respostas:


16

Não.

Os códigos de erro são um anacronismo, originam-se de velhos tempos em que a produção era realmente difícil e cara, e a única maneira de sinalizar uma condição de erro pode ter sido através de várias luzes do painel frontal: painel frontal pdp11 / 70

Atualmente, temos um tratamento maduro de exceções incorporado em praticamente todos os idiomas tradicionais. Use-o. Forneça ao usuário informações com as quais eles possam trabalhar; não os incomode com blá-blá técnico, mas diga a eles aproximadamente o que deu errado e o que eles podem fazer sobre isso. Para o registro, basta fornecer nomes descritivos para suas exceções e registrar o nome. Mais fácil de lembrar e mais fácil de encontrar usando o grep ou ferramentas de pesquisa semelhantes.

A exceção é, obviamente, quando você está programando para situações em que a saída ainda é difícil e cara, como sistemas embarcados ou protocolos de rede. O HTTP ainda usa códigos de resposta numéricos porque eles são extremamente fáceis de analisar com eficiência - em algumas situações, ler apenas o primeiro dígito já pode lhe dizer o suficiente e você pode descartar o restante do pacote.


Obrigado pela resposta detalhada, que faz muito sentido e é bom saber.
ahodder

Seu uso da ilustração corresponde perfeitamente ao seu argumento. Eu li sobre PDP-11 para sempre. Mas este é realmente o primeiro que eu já vi. Obrigado.
Mike Owens

2
Dentro do código, prefiro manipular um código de erro e não sou tão velho assim.
Jeffo

@ Jeff: Tudo o que você pode fazer com códigos de erro também pode ser feito com exceções e, em seguida, um pouco mais. Se você deseja imitar códigos de erro com exceções, tudo que você precisa fazer é lançar em vez de retornar o código de erro e capturar em vez de comparar o valor de retorno com o E_OK (ou qualquer que seja a resposta OK). Para ser justo, C não tem exceções reais, e saltos longos não são tão convenientes; portanto, se você estiver fazendo C, está um pouco desculpado.
Tânger

@ Mike: A imagem é do artigo da Wikipedia na série PDP-11; se isso não é fácil de encontrar, não sei o que é.
Tânger

6

Você deve verificar como os códigos de erro / status são organizados em protocolos comuns, como HTTP . Eles reservam intervalos distintos para diferentes tipos de status / erros. Isso facilita tanto para os usuários identificar um código de status desconhecido quanto para os desenvolvedores atribuírem um código para um novo tipo de erro que não foi tratado antes.


Adicione à sua resposta a questão da taxonomia. Facilitará as coisas para gerenciar e manter os erros.
wleao

3

Desculpe, por que usar códigos de erro?
Capture a exceção, registre-a e ofereça-se para enviar um relatório se o programa não puder se recuperar .

(Supondo que seu idioma seja compatível com exceções.)

A única informação relevante que pode ajudá-lo a corrigir o erro é o rastreamento de pilha que você não obtém com um código de erro. (Também suponho que você queira usar códigos de erro para relatórios de erros e não jogá-los na cara do usuário.)


Isso é verdade, e faço isso, mas o que diria aos usuários? Tenho certeza de que eles ficariam lívidos se estivessem vendendo junto e o aplicativo simplesmente morrer, sem explicação ou qualquer coisa para se enfurecer.
ahodder

6
Eu acho que há pelo menos três coisas diferentes que se confundem aqui. O primeiro são os códigos usados ​​de software para software, como no HTTP. O segundo são códigos que os usuários podem usar em um relatório de erros (como números de incidentes). As últimas são mensagens que podem ser mostradas ao usuário. Pode ajudar a considerá-los como coisas separadas.
Darien

2
Um grande motivo para usar códigos de erro é quando você está criando um aplicativo de back-end. É muito mais fácil e elegante para um programa cliente interpretar e responder a um código do que a uma mensagem de erro ou rastreamento de pilha. Nem todos os erros são de bugs.
Kaypro II

1
Exceções são muito difíceis de acertar! Veja os links em: programmers.stackexchange.com/questions/97874/…
Coder

@ Codificador: seu exemplo abusa de exceções. Você deve pegar o que você espera que seja jogado . A maioria dos métodos não precisa esperar que uma única exceção seja lançada. É totalmente responsabilidade do programador decidir com o que lidar, e eu concordo que pode ser difícil acertar .
Dan

2

Vou assumir um contexto processual (C). Se você tiver objetos, um objeto de erro geralmente é melhor, seja uma exceção ou não.

Você deve usar códigos de erro locais para cada módulo. Para uma biblioteca, você pode ter um cabeçalho especial listando os códigos de erro, com o número 1, 2 etc (ou -1, -2, se preferir). Certifique-se de sempre retornar um desses códigos, por exemplo, traduza errnoem seus próprios códigos. Se você tiver várias camadas de módulos, traduza a cada etapa (ou pré-defina um intervalo para o erro mais profundo, por exemplo, os valores 1001 - 1050 são desse outro módulo).

Também é importante que você forneça um meio de converter o código em uma string. Você nunca deve relatar apenas o código, que só leva à frustração. Na verdade, praticamente qualquer código em seu aplicativo deve vir com uma função de conversão de string. Por exemplo, libc normalmente possui strerrore strsignal, mas infelizmente não possui strwaitstatus.


detalhes fantásticos, obrigado. Isso é realmente muito útil.
214 ahodder
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.