2010-07-20 2 views
12
try { 
     if (isFileDownloaded) 
      //do stuff 
     else 
      throw new CustomException() 
    } 
    catch (Exception e) 
    { 
     // something went wrong save error to log 
    } 
    finally 
    { 
     //release resources 
    } 

La mia domanda è il catch intercetta il blocco ApplicationException nel blocco try? è in uno stile di programmazione scadente? Dovrebbe essere scritto in un altro modo?Throw exception in try block

risposta

21

Il catch cattura l'eccezione (e qualsiasi altra ciò accade). Detto questo, cerco di evitare di scrivere codice come questo, quando possibile.

Personalmente, vedo poche ragioni per avere una gestione delle eccezioni (catch) per un'eccezione generata nello stesso ambito. Se riesci a gestire il tuo errore nel tuo metodo, metti anche la gestione delle eccezioni (cioè: logging) direttamente nel blocco try.

L'utilizzo di catch è più utile, IMO, per rilevare eccezioni generate da metodi all'interno del blocco try. Ciò sarebbe più utile, ad esempio, se la tua sezione // do stuff abbia chiamato un metodo che ha generato un'eccezione.

Inoltre, si consiglia di non rilevare tutte le eccezioni (Exception e), ma piuttosto i tipi specifici di eccezioni che è possibile gestire correttamente. L'unica eccezione potrebbe essere se si sta rilanciando l'eccezione all'interno del proprio catch, ad es .: usandolo per scopi di logging ma continuando a farlo esplodere nello stack delle chiamate.

+3

Qualsiasi cosa tu voglia fare nella cattura puoi fare nel resto che solleva l'eccezione. Dovresti sollevare eccezioni solo in circostanze eccezionali. Per inciso, non dovresti abituarti a chiamare gli oggetti di eccezione 'e'. Questo si scontrerà con il parametro 'EventArgs' nei gestori di eventi. –

+0

@Philip: "Tutto ciò che vorresti fare nella cattura lo puoi fare nel resto che solleva l'eccezione." - Questo era il mio punto :) Per quanto riguarda gli altri argomenti, sono d'accordo su un punto, ma personalmente non ho alcun problema con la denominazione di oggetti di eccezione e (anche se di solito uso un nome più significativo), poiché sono usati raramente con EventArgs direttamente . –

+0

Perché i downvotes? Solo curioso;) –

5

Sì, prenderà ApplicationException come deriva da Exception.

Gestione eccezione di base dovrebbe andare bene nella maggior parte dei casi a meno che non devi effettuare il login o fare qualcosa con un diverso tipo di eccezione ...

try{ 
    if (isFileDownloaded) 
     //do stuff 
    else 
     throw new ApplicationException(); 
} 
catch(ApplicationException ae) 
{ 
    // log it application exception here... 
} 

catch(Exception ex) 
{ 
    // log all other exceptions here... 
} 
finally 
{ 
    // release resources... 
} 
1

Sì, il catch catturerebbe la tua ApplicationException e sì è uno stile di codifica scadente. Come regola generale, prendi in considerazione solo le eccezioni specifiche e quelle con cui dovrai fare qualcosa, ad esempio correggere lo stato dell'applicazione.

1

Inoltre, FYI, ApplicationException è stato deprecato poiché .NET 2.0 è un'eccezione da cui derivare. Non è mai stato concepito come un'eccezione da lanciare da solo, quindi probabilmente non dovresti usarlo affatto.

+0

FxCop applica queste regole. Non puoi lanciare un'eccezione di base o derivare da 'ApplicationException' o' SystemException'. Queste sono le eccezioni di base insieme a 'Exception' stessa –