Eccezioni o codici di errore


12

Stiamo costruendo un servizio web (SOAP, .Net) che parlerebbe con (principalmente) client nativi (windows, C ++) e ci chiediamo quale sia il modo migliore per comunicare errori al client (es. SomethingBadHappened come servizio di accesso non disponibile o qualcosa di simile all'utente non trovato) e non sono stati in grado di decidere tra il lancio dell'eccezione al client o l'utilizzo di un qualche tipo di modello di codice di errore per fare quanto sopra.

Cosa preferiresti sulla gestione sul lato client: ricevere un codice di errore o gestire un'eccezione ServerFault che contiene il motivo dell'errore?
1) Perché stiamo pensando all'eccezione: perché renderebbe il codice lato server molto più uniforme
2) Perché stiamo pensando a codici di errore: perché pensiamo che abbia più senso dal punto di vista del lato client.

Se 2) è davvero vero, vorremmo probabilmente cercare codici di errore che eccezioni? È questo il caso qui?

Inoltre, la risposta cambierebbe se stessimo parlando con client gestiti anziché con client nativi?


Solo per aggiungere un po 'di chiarimenti: a) Sto cercando le migliori pratiche qui e l'esperienza dal lato client (dal momento che il client è molto più complicato e preferiremmo gestire le cose sul lato server se possiamo mantenere il codice client più semplice) b) Il client contiene molto codice legacy e potremmo o meno essere in grado di utilizzare le eccezioni C ++.
Amit Wadhwa,

Questo può aiutare- www.codeproject.com/KB/cpp/cppexceptionsproetcontra.aspx
Gulshan

Risposte:


8

SOAP ha un concetto di errori , è possibile convertire un'eccezione in un errore sul lato server e sul proxy client l'errore può essere nuovamente convertito in un'eccezione. Funziona molto bene nello stack della metropolitana WCF e Java, non può commentare i client C ++ nativi.

Per quanto riguarda le migliori pratiche SOA, definire un errore generico e alcuni errori specifici solo se il client deve gestire un determinato tipo di errore in modo diverso. Non inviare mai una traccia dello stack di eccezioni al client nella distribuzione di produzione. Questo perché in teoria la traccia del server non ha alcun significato per il client e anche per motivi di sicurezza. Registrare l'errore completo e stacktrace sul server e inviare un riferimento univoco al log nell'errore. In WCF utilizzo il blocco Gestione eccezioni Microsoft da Enterprise Library per generare una guida e anche convertire un'eccezione in errore SOAP.

Controlla la guida in Microsoft Patterns and Practices .


Grazie, suona bene. Potete darmi un link più specifico lì all'interno della pagina lì.
Amit Wadhwa,

Anche gli errori a livello aziendale come UserNotFound ecc. Dovrebbero essere gestiti come eccezioni
Amit Wadhwa,

In passato non abbiamo mai usato eccezioni nel codice o errori in SOAP per comunicare le modalità di errore legittime / previste. Abbiamo usato i codici di errore e li abbiamo lasciati al cliente per decidere cosa farne. L'utente non trovato non è in realtà un errore / eccezione, probabilmente dovrebbe essere un codice di stato.
MrLane,

4

Di recente ho fatto un servizio web con le librerie Java 6, che possono riportare un'eccezione al chiamante (non ho esaminato come viene fatto automaticamente).

La possibilità che il client fornisca allo sviluppatore una traccia dello stack nella segnalazione errori è stata molto utile (al contrario di ottenere un timestamp approssimativo e quindi cercare nei registri, se ti capita di registrarlo).

Quindi, visto dal punto di vista degli sviluppatori, usa Eccezioni.


1
Sono d'accordo che questo potrebbe essere utile in dogfood e beta, ma vuoi davvero sputare tracce dello stack nei registri degli eventi o nei file di registro nell'uso del mondo reale (e, naturalmente, rivelando più dettagli sul servizio di quanto tu abbia bisogno / desideri nel processo )
Amit Wadhwa,

2
@Amit, fidati di me su questo: se colpisci una situazione dando una traccia dello stack in produzione, VUOI la traccia dello stack!

1
Qual è il vantaggio sulla traccia dello stack sul lato client, registreremo sicuramente tutte le eccezioni sul lato server prima di passarlo al client.
Amit Wadhwa,

Anche gli errori a livello aziendale come UserNotFound ecc. Dovrebbero essere gestiti come eccezioni
Amit Wadhwa,

-2

Se si tratta di un servizio Web, non è possibile fare in modo che il server generi un'eccezione che verrà rilevata dal client. Nell'interfaccia, il tuo server deve sostanzialmente restituire una sorta di codice di errore, anche se è una stringa che dice An exception occurred. Type %s, message %s, stack trace %s.

Per quanto riguarda il lato client, è possibile che il codice di lettura della risposta controlli la risposta per vedere se contiene un errore e sollevare un'eccezione sul lato client. Questo è un ottimo modo per farlo, almeno in lingue con una buona gestione delle eccezioni. Il C ++, tuttavia, non ha una buona gestione delle eccezioni ed è una buona idea stare il più lontano possibile dalle eccezioni del C ++. Se non riesci a usare una lingua migliore, segui semplicemente i codici di errore.


Immagino che l'eccezione non
rilevata

3
Non c'è nulla di sbagliato nelle eccezioni C ++ o C ++. Ci sono molte ragioni per usare un linguaggio diverso dal C ++ per alcuni progetti, ma la gestione delle eccezioni non è una di queste.
KeithB

Non solo contro le migliori pratiche di sicurezza: cosa dovrebbe fare esattamente il client con la traccia dello stack del server? Stamparlo e inviarlo a te? Invia come e-mail? Utilizzare per carta lubrificante?
JensG,

@JensG: se si tratta di un servizio Web e non di un sito Web , il client dovrebbe essere abbastanza professionale da inviarti un'e-mail come segnalazione di bug.
Mason Wheeler,
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.