2011-01-12 6 views
17

La gestione degli errori legacy tende a seguire il metodo con cui tutte le funzioni restituiscono un codice in base al successo/fallimento. Dovresti controllare questo codice e gestire (se c'è un errore) in modo appropriato.Perché è meglio lanciare un'eccezione anziché restituire un codice di errore?

I linguaggi di programmazione moderni seguono tuttavia il modello di eccezione, dove se succede qualcosa straordinario che non può essere gestito correttamente viene lanciata un'eccezione che continua a ribollire fino a quando non viene gestita.

La mia domanda è perché ci siamo spostati verso il modello di eccezione? Quali sono le ragioni alla base di questo? Perché è meglio?

Le spiegazioni/collegamenti sarebbero molto apprezzate.

risposta

20

Ho scritto su questo a lungo: Exceptions vs. status returns, ma per breve tempo:

  1. eccezioni lascia il vostro codice pulito di tutti i controlli necessari durante il test restituisce lo stato su ogni chiamata,
  2. eccezioni si lascia utilizzare il valore restituito delle funzioni per i valori effettivi,
  3. Le eccezioni possono trasportare più informazioni di una possibile restituzione dello stato,
  4. La cosa più importante: le eccezioni non possono essere ignorate tramite inazione, mentre i ritorni di stato possono.

Per espandere l'ultimo punto: se si dimentica di fare ciò che si dovrebbe fare con i ritorni di stato, si ignorano gli errori. Se ti dimentichi di fare ciò che dovresti fare con le eccezioni, l'eccezione bolle fino al livello esterno del software dove diventa visibile.

+1

non hai escluso il tuo elenco il fatto che l'utilizzo di eccezioni consenta try/catch (MyCustomException ex) in modo che tu (o altri sviluppatori) possa aggiungere try/catch che cattureranno solo il nuovo tipo di eccezione che hai creato. –

+0

Questo è un punto eccellente. Mi piace che i livelli possano ignorare le eccezioni e lasciarli passare. Il tuo punto è che può essere ben definito per il singolo tipo di eccezione (presupponendo che tu stia utilizzando una lingua che supporta l'acquisizione di eccezioni per tipo). –

9

Qui ci sono un paio di ragioni

  • Ignorando un'eccezione richiede un intervento da parte dello sviluppatore, ignorando un valore di ritorno cattivo richiede esattamente 0 azione. Questo, in teoria, rende più probabile che uno sviluppatore gestisca un errore, ignorandolo o addirittura non rendendosi conto che stava accadendo.
  • Fornisce una separazione più pulita tra il punto di un errore e la gestione. Non impone la propagazione manuale dell'errore in ogni punto intermedio.
  • Le eccezioni possono avere un payload di informazioni più ampio e più ricco rispetto a un semplice codice di errore. Ci sono modi per farlo con i codici di errore, ma è più di un ripensamento ed è un po 'macchinoso.
2

I codici di stato sono in genere migliori delle eccezioni nei casi in cui rappresentano i casi in cui il codice di chiamata immediato di una funzione è pronto per essere gestito. Il problema con i codici di stato è che se il codice chiamante immediato non li gestisce, è probabile che non lo farà nulla. Se il codice genera un'eccezione e il codice chiamante immediato non è pronto a gestirlo, l'eccezione si propagherà al codice che, almeno, afferma di essere così preparato.

Problemi correlati