Domanda

Perché è una "cattiva idea" di gettare le proprie eccezioni?

trovato qui

È stato utile?

Soluzione

In generale, è perfettamente bene di gettare le proprie eccezioni. Forse ciò che si intende chiedere era: "Quando è che non necessariamente una buona idea di lanciare la mia eccezione?"

Un caso è quando si dovrebbe essere buttare un'eccezione standard. Ad esempio, se il metodo prende un nome di file e deve restituire un file, probabilmente si dovrebbe buttare FileNotFoundException di serie della vostra piattaforma, piuttosto che buttare PeanutPowersFileNotFoundException. Se davvero si vuole lanciare la propria eccezione, probabilmente si dovrebbe avere estendere il FileNotFoundException standard.

Aggiornamento: Bloch spiega al punto 60 di Effective Java

Altri suggerimenti

Non è. È necessario creare e generare eccezioni personalizzate ogni volta che avete una situazione eccezionale.

Non è previsto che derivano da qualunque sia il tipo di eccezione base tipo è (std :: eccezioni in C ++, o delle eccezioni in pitone, ecc ...)

Se _aren't_derived dal tipo di base normale, quindi gli altri non possono prenderli quando sono in attesa di catturare tutte le eccezioni -. Che sarebbe una cosa negativa

Non è sbagliato per creare il proprio tipo di eccezione. Tuttavia, prima di passare attraverso creare il proprio, si dovrebbe verificare se il quadro prevede già un'eccezione che si adatta.

.Net linee guida di progettazione :

  

Si consideri generare eccezioni esistenti   residente nei namespace di sistema   invece di creare eccezione personalizzata   tipi.

     

Non creare e generare eccezioni personalizzate   se si dispone di una condizione di errore che   può essere di programmazione gestita in   modo diverso rispetto a qualsiasi altro esistente   eccezioni. In caso contrario, gettare una delle   le eccezioni esistenti.

     

Non creare e lanciare nuove eccezioni   solo per avere eccezione della tua squadra.

Credo che si potrebbe chiedere perché è una cattiva idea di ri-throw eccezioni.

Con il termine "rethrow", voglio dire la cattura un'eccezione e che generare una nuova e gettandola. Questo può essere problematico, in quanto si potrebbe finire per consumare l'analisi dello stack originale e perdere tutto il contesto dell'errore.

Non si deve inventare il proprio tipo di eccezione, se non si ha qualcosa in più che si desidera aggiungere al tipo di eccezione.

Se si vuole dire che l'utente del vostro API che essi hanno fornito un argomento non valido, si dovrebbe buttare un ArgumentException, ma se la libreria non riesce a causa di qualche ragione specifica biblioteca, che non si può trasmettere in un'eccezione regolare, si dovrebbe rotolare il proprio e lasciarlo contiene informazioni lo sviluppatore ha bisogno.

Per continuare la risposta di Pietro un altro caso in cui un'eccezione, non è una buona idea è se si utilizza generare eccezioni per controllare la logica di business del vostro programma.

Fino a quando l'eccezione si sta gettando è derivato da un oggetto proprio, e trasmette solo che -. Situazione eccezionale, un'eccezione è del tutto accettabile

Utilizzo di eccezioni da lancio per controllare la logica di business, oltre ad essere un modello di progettazione cattivo ha anche implicazioni sulle prestazioni - lancio e la cattura delle eccezioni è piuttosto costoso rispetto alla ramificazione sulla base dei risultati restituiti dal metodo

Non c'è niente di sbagliato con la creazione delle vostre eccezioni, che possono essere adattati per trasmettere esattamente le informazioni che è appropriato per la situazione. Un ConfigFileNotFoundException ricco di informazioni rispetto a FileNotFoundException (che file non abbiamo trovato?).

Ma, con tutti i mezzi, fare in modo che si cattura e gestire ogni eccezione personalizzata all'interno di tuo di codice. Quando l'eccezione vola in qualche luogo al di fuori il vostro modulo (lo chiamano pacchetto, lo chiamano namespace), quelle persone là fuori non si sa nemmeno che esiste, e tanto meno che cosa fare con esso. Fatta eccezione per un catch (Throwable t) {/* whut? */}.

A me pare che la questione è quello di catturare i candidati inesperti cercano di esperienza falso. Non c'è niente di sbagliato in tirando le proprie eccezioni a mio parere, e come si può vedere a tutti gli altri che hanno risposto qui.

Non è una cattiva idea a tutti. Se si pone una situazione eccezionale, un'eccezione dovrebbe essere gettato per gestire la cosa, soprattutto se si sta progettando il codice che altri possono utilizzare, può ricevere input non validi, ecc.

Si tratta di una cattiva idea di utilizzare le eccezioni in cui non sono assolutamente necessarie, come ad esempio le situazioni che sono recuperabili dai controlli normali nel codice o come parte di esecuzione normale, dal momento che hanno un sacco di overhead associato con loro. Immagino che è dove si può avere ottenuto l'idea che sono una cattiva idea in generale. Ma per quello che sono stati concepiti per fare (segnalazione di una situazione eccezionale che il codice non è in grado di gestire), sono assolutamente il migliore strumento.

E se fate creare eccezioni personalizzate per gli altri codice potrebbe usare, documentare ciò che sono e che cosa significano. In questo modo in seguito gli utenti del vostro codice sapranno che sono possibili e il loro significato, se si presentano, e in grado di gestire in modo appropriato.

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