2010-12-12 24 views
9

È una domanda sulla migliore pratica .net. Ho sempre preso e memorizzate le informazioni sulle eccezioni in tutte le mie applicazioni web e finestre forme come segue:Come gestire le eccezioni?

  1. circondato ogni metodo con il tentativo di cattura (eccezione Exception)
  2. Per ogni strato tranne strato anteriore, gettò eccezione alla strato sopra
  3. Nel livello anteriore, ha registrato l'eccezione in un file di registro (in genere utilizzando log4config.dll) e ha presentato all'utente un messaggio di facile utilizzo.

È questo il modo migliore per gestire le eccezioni? O dovrei fare qualcosa di diverso nei miei prossimi progetti?

+0

Che cosa si intende per 1.Surrounded ogni metodo con try catch (Exception eccezione) – Stilgar

+0

try {// fare qualcosa} catch (Exception eccezione) {// fare qualcosa} – InfoLearner

risposta

2

Il seguente codice è problematico perché sovrascrive l'analisi dello stack originale per e, il che rende i problemi più difficili da diagnosticare:

public void Foo() { 
    try { 
     Bar(); 
    } catch(Exception e) { 
     throw e; // re-throw; overwrites original stacktrace in 'e' 
    } 
} 

Il seguente codice non dispone quanto sopra stacktrace problema di sovrascrittura, ma è ancora inutilmente prolisso :

public void Foo() { 
    try { 
     Bar(); 
    } catch(Exception e) { 
     throw; // re-throw; preserves original stacktrace in 'e' 
    } 
} 

Entrambi sarebbero meglio scritti come di seguito. Questo perché, se l'unica cosa che si sta facendo nel vostro blocco catch è ri-gettando l'eccezione, non c'è bisogno di scrivere il blocco catch a tutti:

public void Foo() { 
    Bar(); 
} 
+4

Per essere precisi, "buttare e "è peggio perché perde lo stack e ne ricrea uno, dovrebbe essere solo" lanciare "senza alcun argomento. –

+0

Dimostrando così quanto sia facile per il codice ben intenzionato peggiorare le cose :) –

+0

@Simon - buona presa. Grazie. Ho aggiornato la mia risposta. –

6

non vorrei aggiungere 1 & 2 a meno che non ho avuto qualche motivo specifico; per esempio per alterare (avvolgere) il messaggio; non ce n'è bisogno visto che le eccezioni saliranno comunque verso l'alto. E fatto in modo errato si può rimuovere per errore l'importantissima traccia dello stack (throw; vs throw ex; - il primo preferito).

-1

Ecco come NON a gestire le eccezioni.

public void method1(){ 
    try{ 
     .... 
     // all the code goes here 
     // declare any helper methods throw throwable 
     // eg: private boolean check1() throws Throwable{ ...} 
     .... 
    }catch(Throwable t){ 
     System.out.println("oops...error...good luck debugging. "); 
    } 
} 
+0

Nessuno può suggerire un modo più pigro per gestire le eccezioni che questo :) – rana

Problemi correlati