2011-02-08 7 views
6

Ho letto un tale metodo:Dovremmo sempre catturare un'eccezione, avvolgerla e trasmetterla?

public void doSomething throws MyException{ 
    ... 
    try { 
     doSomthingElse(); 
    } catch (MyException e){ 
     log.errer(e.getMessage()); 
     throw new MyException(e.getMessage(),e); 
    } 
    ... 
} 

Ma io preferisco:

public void doSomething throws MyException{ 
    ... 
    doSomthingElse();   
    ... 
} 

Chiunque conosce alcuna ragione per il primo metodo? Esiste un solo tipo di Eccezione, e non è gestito in questo metodo, c'è qualche ragione per prenderlo, avvolgerlo senza nuove informazioni, e poi passarlo in su? Perché non scriverlo solo nel secondo modo? Grazie!

+1

Perché tutti hanno la sensazione di dover rilevare eccezioni? Non prendere cose che non puoi * fare nulla con *. Le eccezioni automaticamente riempiono lo stack se non le tocchi. Non c'è assolutamente alcun motivo per * rilanciarli * (e così facendo ha conseguenze negative, come perdere informazioni preziose). E se * puoi * fare qualcosa con l'eccezione, beh, stai confinando con sospetto sul territorio dell'utilizzo di eccezioni per il controllo del flusso, cosa che probabilmente non dovresti fare in primo luogo. –

risposta

5

L'eccezione di registrazione e il lancio ulteriore è in realtà un anti-pattern per diversi reasons. La regola generale è: se non puoi fare nulla di utile per gestire l'eccezione (la registrazione è non che gestisce l'eccezione nella maggior parte dei casi), lascia che il tuo framework/contenitore lo faccia per te. Se è possibile (ad esempio utilizzare una diversa memoria quando il database non è disponibile, accodare i pacchetti quando la rete non funziona), registrare l'eccezione e procedere (ricordarsi sempre di registrare lo stack).

Se si dispone di un'eccezione controllata, avvolgerla in fase di esecuzione uno e riavviare (creare l'eccezione personalizzata o cercare quella esistente che corrisponde alle proprie esigenze).

0

Altro che voler registrare l'eccezione o fare qualcos'altro con esso "localmente", non vedo alcun motivo.

0

Potrebbe essere necessario rilevare e registrare l'errore specifico nel punto in cui si verifica come per una registrazione migliore, ma gestirlo a un livello superiore lanciando una nuova eccezione.

+0

Questo non dovrebbe essere un motivo, dal momento che la registrazione può essere eseguita a un livello superiore (il chiamante del metodo doSomething), e dallo stacktrace possiamo individuare la posizione di Eccezione. – chance

+0

Sì, è vero, ma potresti non voler registrare tutte le eccezioni a un livello superiore, (per qualche motivo), e se si tratta di un'eccezione generica, la rifusione di un'eccezione specifica o l'aggiunta di un messaggio potrebbe essere utile per gestirla in un modo specifico più in alto. – Duveit

1

La ragione di questo "wrapper" nell'esempio potrebbe non essere mai perdere un'eccezione e almeno registrarla. Non vedo alcun altro senso in quel blocco catch, in quanto questi sono in genere dichiarati in grado di recuperare da un'eccezione e forse fare "pulizia adeguata".

Preferisco ereditare una classe di eccezione personalizzata da un'eccezione esistente.

Nel costruttore di questa nuova eccezione, la registrazione ha luogo. In questo modo, salverò l'overhead di generare un'altra nuova Eccezione con traccia completa e l'altro sovraccarico con esso.

2

Dipende dalla relazione tra le classi. In generale, preferisco delegare la registrazione al chiamante. Di solito è il chiamante che sa anche come gestire un'eccezione: riprovare? avvisare l'utente? log? dimenticare?

Misko Hevery is a good read sull'oggetto.

Problemi correlati