Come si assegnano i codici di errore?


13

Come, quando si sviluppa un progetto di medie dimensioni, si identificano, si creano e si mantengono i codici di errore?

Io per la vita di me non riesco a pensare a un metodo semplice e pulito per farlo. Alcune delle mie idee convertono i nomi di classe e il nome del metodo in una stringa intera, ma questo è troppo lungo da mostrare all'utente in aggiunta al fatto che i nomi dei metodi e i nomi delle classi possono cambiare (speriamo di no!). Altri stanno semplicemente utilizzando un sistema di registro incrementale (ad es. Quando creo un nuovo messaggio di errore, basta aggiungere 1 all'ID dell'ultimo messaggio di errore). Ma questo è completamente non organizzato.

Per essere più specifici, sto parlando di un codice di errore come:

Error 401 Unauthorized.


1
codici di errore? Come "numeri magici"? Ad esempio ... ERRORE 001. Quindi vai a un elenco e leggi ERRORE 001 significa che bla bla bla ... Sì?
wleao,

@wleao - Yessir. Modificherò la mia domanda per includerla. Grazie.
ahodder


Come hai modificato nella tua domanda. Dai un'occhiata a come lo fanno con http. Non so se sia una buona idea usare numeri magici. Tuttavia, se sei davvero disposto a farlo, segui i loro concetti. Ad esempio, hanno una tassonomia di errori (ce l'hai?).
wleao,

@wleao - non ancora, ma grazie a te e Péter Török, ne creerò sicuramente uno. :)
ahodder

Risposte:


16

No.

I codici di errore sono un anacronismo, derivano dai vecchi tempi in cui l'output era davvero difficile e costoso e l'unico modo per segnalare una condizione di errore potrebbe essere stato attraverso un gruppo di spie del pannello frontale: pannello frontale pdp11 / 70

In questi giorni, abbiamo una gestione matura delle eccezioni integrata in quasi tutti i linguaggi tradizionali. Usalo Fornire all'utente le informazioni con cui può lavorare; non disturbarli con il tecnico blah-blah, ma piuttosto dire loro in modo approssimativo cosa è andato storto e cosa possono fare al riguardo. Per la registrazione, basta dare i nomi descrittivi alle eccezioni e registrare il nome. Più facile da ricordare e anche più facile da trovare utilizzando grep o strumenti di ricerca simili.

L'eccezione è, ovviamente, quando si sta programmando situazioni in cui l'output è ancora difficile e costoso, come sistemi integrati o protocolli di rete. HTTP utilizza ancora codici di risposta numerici perché sono estremamente facili da analizzare in modo efficiente: in alcune situazioni, leggere solo la prima cifra può già dirti abbastanza e puoi scartare il resto del pacchetto.


Grazie per la risposta dettagliata, ha molto senso ed è buono a sapersi.
ahodder

Il tuo uso dell'illustrazione corrisponde perfettamente al tuo argomento. Ho letto di PDP-11 per sempre. Ma questo è in realtà il primo che abbia mai visto. Grazie.
Mike Owens,

2
All'interno del codice, preferirei gestire un codice di errore e non sono così vecchio.
JeffO

@Jeff: Tutto ciò che puoi fare con i codici di errore può essere fatto anche con eccezioni, e poi un po 'di più. Se vuoi imitare i codici di errore con eccezioni, tutto ciò che devi fare è lanciare invece di restituire il codice di errore e catturare invece di confrontare il valore restituito con E_OK (o qualunque sia la risposta OK). Ad essere sinceri, C non ha eccezioni reali e i salti lunghi non sono altrettanto convenienti, quindi se stai facendo C, sei un po 'scusato.
tdammers,

@Mike: l'immagine è tratta dall'articolo di Wikipedia sulla serie PDP-11; se non è facile da trovare, non so cosa sia.
tdammers,

6

È necessario verificare come i codici di errore / stato sono organizzati in protocolli comuni come HTTP . Riservano intervalli distinti per diversi tipi di stati / errori. Ciò semplifica sia per gli utenti l'identificazione di un codice di stato sconosciuto, sia per gli sviluppatori di assegnare un codice per un nuovo tipo di errore che non è stato gestito in precedenza.


Aggiungi alla tua risposta la cosa tassonomia. Renderà le cose più facili da gestire e mantenere gli errori.
wleao,

3

Siamo spiacenti, perché utilizzare i codici di errore?
Cattura l'eccezione, registralo e offri di inviare un rapporto se il programma non può essere ripristinato .

(Supponendo che la tua lingua supporti le eccezioni.)

Le uniche informazioni rilevanti che potrebbero aiutarti a correggere il bug sono la traccia dello stack che non ottieni con un codice di errore. (Suppongo anche che tu voglia utilizzare i codici di errore per i rapporti di errore e non gettarli in faccia a un utente.)


È vero, e lo faccio, ma cosa direi agli utenti? Sono sicuro che sarebbero lividi se avessero spacciato e l'applicazione dovesse morire, nessuna spiegazione o qualcosa su cui far finta di niente.
ahodder

6
Penso che ci siano almeno tre cose diverse che si confondono qui. Il primo sono i codici utilizzati da software a software, come in HTTP. Il secondo sono i codici che gli utenti possono utilizzare in una segnalazione di errori (come i numeri di incidenti). Gli ultimi sono messaggi che possono essere mostrati all'utente. Può essere utile considerarli come cose separate.
Darien,

2
Un grande motivo per utilizzare i codici di errore è quando si crea un'applicazione back-end. È molto più semplice ed elegante per un programma client interpretare e rispondere a un codice piuttosto che a un messaggio di errore o una traccia dello stack. Non tutti gli errori provengono da bug.
Kaypro II,

1
Le eccezioni sono molto difficili da ottenere! Vedi link in: programmers.stackexchange.com/questions/97874/…
Coder

@Coder: il tuo esempio abusa delle eccezioni. Dovresti prendere ciò che ti aspetti di essere lanciato . La maggior parte dei metodi non deve aspettarsi che venga generata anche una sola eccezione. È totalmente responsabilità del programmatore decidere cosa gestire e sono d'accordo che potrebbe essere difficile farlo bene .
Dan

2

Assumo un contesto procedurale (C). Se si dispone di oggetti, un oggetto errore è in genere migliore, indipendentemente dall'eccezione.

È necessario utilizzare codici di errore locali per ciascun modulo. Per una libreria puoi avere un'intestazione speciale che elenca i codici di errore, con il numero 1, 2 ecc. (O -1, -2 se preferisci). Assicurati di restituire sempre uno di questi codici, ad esempio traduci errnonei tuoi codici. Se hai più livelli di moduli, traduci ad ogni passo (o predefinisci un intervallo per l'errore più profondo, ad esempio i valori 1001 - 1050 provengono da quell'altro modulo).

È anche importante fornire un mezzo per tradurre il codice in una stringa. Non dovresti mai segnalare solo il codice, il che porta solo alla frustrazione. In realtà praticamente qualsiasi codice nella tua applicazione dovrebbe avere una funzione di traduzione delle stringhe. Ad esempio, libc in genere ha strerrore strsignal, ma purtroppo manca strwaitstatus.


dettaglio fantastico, grazie. Questo è davvero utile.
ahodder
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.