prendendo le eccezioni C #

Qual è il modo giusto di fare.

Per cogliere eccezioni dalla più specifica alla più generale o opposta.

se scrivo

try { ... } catch( Exception e ) { ... } catch( NullReferenceException nre ) { ... } 

NullReferenceException nre sarà mai catturato?

Il più specifico prima

NullReferenceException nre sarà mai catturato?

vero

no, non verrà catturato

 try { ... } catch( NullReferenceException nre ) { ... } catch( Exception e ) { ... } 

Inoltre non vorrei prendere NullReferenceException , vorrei testare se il valore a cui sto tentando di accedere non è nullo prima di accedervi effettivamente o utilizzare l’ operatore null coalescing (??) per assicurarmi che questa eccezione non accada mai.

La cattura di un’eccezione generale dovrebbe essere evitata. IMHO dovresti farlo solo in alcuni gestori di eccezioni globali perché raramente puoi gestire il caso di tutte le eccezioni possibili ogni volta che chiami un metodo. In questo caso dovresti solo prendere alcune eccezioni specifiche e prendere le dovute azioni.

No, devi andare dal più specifico al più generale. Il tuo esempio deve assomigliare

 try { } catch(NullReferenceException nre) { } catch(Exception e) { } 

vedi qui (MSDN)

No, non lo farà.

Va nell’ordine in cui lo posizioni. Metti le eccezioni più specifiche nella parte superiore e il generale nella parte inferiore.

http://msdn.microsoft.com/en-us/library/0yd65esw.aspx

No. Dovresti prendere le eccezioni dal più specifico al generale.

la maggior parte derivata da meno derivata

Un blocco try può generare più eccezioni, che possono essere gestite utilizzando più blocchi catch. Ricorda che un blocco di cattura più specializzato dovrebbe venire prima di uno generalizzato. Altrimenti il ​​compilatore mostrerà un errore di compilazione.

fonte

Per essere catturati, la NullReferenceException sarà la prima nella lista di cattura.

 try { ... } catch (NullReferenceException ex) { .... } catch (Exception ex) { ... } 

Questo specifica che desideri gestire NullReferenceException in un modo particolare, con cui hai qualcosa a che fare. Quindi, lasciando che gli altri tipi di eccezioni cadano attraverso la cattura più generica. D’altra parte, la gestione delle eccezioni non specifiche dovrebbe essere evitata come suggerisce questo articolo MSDN: Exception Handling .

Inoltre, è meglio verificare se l’object da accedere è null (Nothing in Visual Basic) prima di provare ad accedervi, invece di lasciare che il codice acceda all’object e lancia questa eccezione quando è nullo. Ecco un link utile per questa materia: Exception Handling Best Practices in .NET .

naturalmente è dal più specifico al generale.

 try { ... } catch (IOException ex) { .... } catch (Exception ex) { ... }