Domanda

A volte non so tipo strega di eccezione dovrei buttare. Così io di solito butto Exception (). C'è qualche bel articolo su questo?

È stato utile?

Soluzione

Se non stanno facendo alcun tentativo di recuperare da un errore, si può semplicemente gettare un Exception con una stringa di dirvi cosa è andato storto. (O se si eseguire la stessa azione indipendentemente da ciò che si è verificato l'errore).

A parte che lo rende evidente a un programmatore cosa è andato storto utilizzando un nuovo nome eccezione piuttosto che metterlo nel Messaggio, e l'eccezione può contenere dati per aiutarvi a recuperare da una particolare eccezione.

Per esempio, un ArgumentNullException ha un ParamName proprietà, che è necessario impostare quando si lancia l'eccezione. Quando le catture chiamante, egli può poi cercare questa proprietà e decidere di passare un nuovo valore per l'argomento che ha causato l'errore, o può stampare un errore rilevante per informare il programmatore di cosa è andato storto.

E 'un peccato che le eccezioni sono raramente utilizzati per il loro pieno potenziale (in molte API open source e simili), e sono spesso semplicemente inserito per informare un programmatore cosa è andato storto. Non c'è molta differenza tra queste 2 se non avete intenzione di leggere la proprietà ParamName quando si cattura esso. (Molte persone non daranno fastidio, e prendere solo Exception comunque).

throw new ArgumentNullException("arg1");
throw new Exception("arg1 is null");

Può essere difficile per recuperare da un errore del tutto, ma in alcune applicazioni, però, si potrebbe trovare auspicabile creare eccezioni personalizzate in grado di fornire tutti i dettagli necessari.

Per il momento, vorrei solo mettere Exception nella ricerca Visualizzatore oggetti in VS, e vedere ciò che è già lì. I loro nomi sono piuttosto auto esplicativo, così si dovrebbe essere in grado di scegliere qualcosa di adatto.

Altri suggerimenti

Il problema di lanciare un'eccezione generica è che limita la capacità del codice più in alto lo stack per gestire in modo corretto (cioè le migliori prassi è quella di intercettare l'eccezione specifica più possibile prima di cadere di nuovo, e solo a catturare ciò che si può manico).

Jeffrey Richter ha una sezione eccellente sulla gestione delle eccezioni (tra cui informazioni sul namespace System.Exception) in CLR via C #

"Linee guida di progettazione quadro" da Cwalina e Abrahms tratta questo argomento davvero bene (IMHO).

E 'disponibile gratuitamente on-line qui , o il libro (non gratuito) qui (UK) o qui (US) . Guardate nella sezione intitolata Linee guida di progettazione per eccezioni .

Bene, l'unica cosa che non si deve fare è un tiro Exception sé.
Sempre alla ricerca di una sottoclasse appropriata.

Non so di alcun ortografia pubblicazione quale eccezione a gettare quando, ma ArgumentException e InvalidOperationException deve prendersi cura della maggior parte dei vostri casi.

Fare domande distinte sui casi separati, se sono venuti fuori.

vorrei suggerire che divide eccezioni in alcune categorie sulla base dello stato del sistema:

  1. Il metodo non è riuscita in modo tale che una non ha fatto nulla; lo stato di tutti i dati sottostanti non è stato disturbato, e probabilmente è valida. Scenari tipici: cercando di recuperare da una collezione un oggetto che non c'è, o aggiungere quello che già è. Un altro possibile scenario: un timeout di comunicazione nei casi in cui non dovrebbe avere causato alcuna perdita di dati (e sono stati ritentare l'operazione potrebbe avere successo se il problema era semplicemente che l'altra estremità era semplicemente troppo lento).
  2. Il metodo fallito in un modo che può aver disturbato struttura dati sottostante, o la struttura di dati sottostante può essere danneggiato in precedenza. Ulteriori operazioni non dovrebbero essere tentate con questa struttura dati a meno che non vengano prese misure per convalidarlo. Un altro possibile scenario: un sistema di comunicazione di timeout si verifica quando un record è stato parzialmente recuperato, ei dati parzialmente recuperati è ormai persa. A seconda del protocollo, può essere necessario per eseguire una certa azione di recupero sulla connessione, o per chiuderlo e avviare una nuova.
  3. qualcosa è seriamente sbagliato con lo stato del sistema, e il recupero non è probabile possibile.

Purtroppo, eccezioni .net esistenti non si adattano qualcosa di simile modello; sarebbe stato bello se ci fosse un tipo ExceptionBase da cui derivano le cose come ThreadAbortException, CpuHasCaughtFireException, e l'eccezione 'normale', e tutte le eccezioni 'normali' sono state derivate da Exception. Capisco che .net 4.0 kludges un po 'in un tale progetto, ma io non conosco la meccanica esatte. In ogni caso, vorrei suggerire che tutte le eccezioni definite dall'utente dovrebbero essere divisi in gruppi come sopra, con tutte le eccezioni in ogni gruppo che condividono un antenato comune distinto da altri gruppi.

C'è un articolo di Krzysztof Cwalina ( "un architetto principale del team di .NET Framework di Microsoft") chiamato la scelta del giusto tipo di eccezione per gettare che getta luce su questo. Si tratta di scegliere l'eccezione diritto di lanciare e una guida su come creare eccezioni personalizzate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top