2010-06-21 1 views
6

In .NET, quando si rilevano le eccezioni, devo sempre rilevare le eccezioni derivate (quindi non ArgumentException ma i tipi derivati)?Individuazione delle eccezioni derivate?

anche:

Se mi viene chiesto di utilizzare i codici di errore, questo sarebbe nel costruttore in questo modo ?:

throw new Exception ("4000", ex);

Oppure un tipo di eccezione personalizzato con una proprietà del codice di errore? (Ciò potrebbe creare confusione con tipi di eccezioni come SqlException che hanno codici di errore che si associano agli errori di SQL Server).

Grazie

+0

Da dove provengono i codici di errore? Questi codici di errore sono codici di errore Win32 nativi? –

risposta

6
  1. Cattura l'eccezione più ampia che sai come gestire.

    In generale, ciò significa che si verificherà un'eccezione piuttosto specifica. E alcune eccezioni, come ArgumentException s, non dovrebbero essere catturate affatto b/c indicano un errore logico in contrasto con un errore di runtime. Un posto in cui ho trovato che trova un'eccezione più ampia utile è nel caso di I/O su file. Un IOException può essere una pratica eccezione di livello superiore da catturare.

  2. Se viene richiesto di utilizzare i codici di errore, è possibile utilizzare la proprietà message di un'eccezione per includerlo, ma non lo utilizzerei mai come motivo per evitare di generare un'eccezione tipizzata correttamente. Questo perché ci sono due preoccupazioni separate qui:

    a. Il codice di errore è lì per fornire una specifica informazione che può essere consultata in caso di guasto sul campo. Non dovrebbe mai essere usato per discriminare tra tipi di eccezioni a livello di codice b/c la lingua ha una struttura specifica progettata per questo: tipi di eccezioni.

    b. L'eccezione opportunamente tipizzata è lì per fornire un modo programmatico di distinguere tra le eccezioni. Il linguaggio è progettato per questo, usalo. Non mai gettare un piano Exception.

    Probabilmente inserisco un codice di errore nello Exception.Data collection. Ciò evita di sovrascrivere i messaggi in Exception.Message che sarebbero altrimenti molto utili per scopi diagnostici.

+0

Non sono sicuro che ci siano molte basi in generale per quanto riguarda ArgumentException come più o meno "gravi" di molti altri tipi. Quello che si deve veramente sapere quando si rileva un'eccezione è lo stato del sistema (e se la routine che ha generato l'eccezione lo abbia influenzato).Se provi ad es. analizzare un file, non sono sicuro che ci sia molto valore nella convalida di tutti i campi prima di chiamare routine che genererebbero ArgumentException se i loro argomenti non sono validi, a meno che il mio codice non possa fare qualcosa di più utile di un'eccezione data l'input non valido. Quindi vedo a malapena che ciò implica "errore logico". – supercat

2

Questo dipende se si vuole catturare un'eccezione precisa o un gruppo di diversi tipi di eccezioni.

A volte si desidera aggiungere la gestione per 1 sola eccezione esatta. Altre volte la tua gestione delle eccezioni sarà la stessa per qualsiasi tipo di eccezione, quindi puoi semplicemente catturare o catturare semplicemente Exception per vedere qual è l'eccezione.

Ad esempio, è possibile rilevare solo 1 eccezione esatta e nessun'altra gestione delle eccezioni. Lo faresti quando saprai più in alto nello stack delle chiamate che stai prendendo il resto delle eccezioni ma vorresti ignorare solo quello che stai catturando esattamente.