Exceptionè il tipo base per tutte le eccezioni, e come tale terribilmente non specifico. Non dovresti mai lanciare questa eccezione perché semplicemente non contiene informazioni utili. Chiamare il rilevamento del codice per le eccezioni non è stato in grado di disambiguare l'eccezione lanciata intenzionalmente (dalla logica) da altre eccezioni di sistema che sono del tutto indesiderate e indicano difetti reali.
Lo stesso motivo vale anche per SystemException. Se guardi l'elenco dei tipi derivati, puoi vedere un numero enorme di altre eccezioni con semantica molto diversa.
NullReferenceExceptione IndexOutOfRangeExceptionsono di tipo diverso. Queste sono eccezioni molto specifiche, quindi lanciarle potrebbe andare bene. Tuttavia, non vorrai ancora lanciarli, poiché di solito significano che ci sono alcuni errori reali nella tua logica. Ad esempio, l'eccezione di riferimento nullo significa che stai tentando di accedere a un membro di un oggetto che è null. Se questa è una possibilità nel tuo codice, dovresti sempre controllare esplicitamente nulle lanciare invece un'eccezione più utile (ad esempio ArgumentNullException). Allo stesso modo, IndexOutOfRangeExceptions si verificano quando si accede a un indice non valido (su array, non su elenchi). Dovresti sempre assicurarti di non farlo in primo luogo e controllare prima i confini, ad esempio, di un array.
Ci sono alcune altre eccezioni come quelle due, ad esempio InvalidCastExceptiono DivideByZeroException, che vengono lanciate per errori specifici nel tuo codice e di solito indicano che stai facendo qualcosa di sbagliato o che non stai prima controllando alcuni valori non validi. Lasciandoli consapevolmente dal tuo codice, stai solo rendendo più difficile per il codice chiamante determinare se sono stati lanciati a causa di qualche errore nel codice, o semplicemente perché hai deciso di riutilizzarli per qualcosa nella tua implementazione.
Naturalmente, ci sono alcune eccezioni (hah) a queste regole. Se stai creando qualcosa che potrebbe causare un'eccezione che corrisponde esattamente a una esistente, sentiti libero di usarlo, specialmente se stai cercando di abbinare un comportamento integrato. Assicurati solo di scegliere un tipo di eccezione molto specifico allora.
In generale, tuttavia, a meno che non trovi un'eccezione (specifica) che soddisfi le tue esigenze, dovresti sempre considerare di creare i tuoi tipi di eccezione per eccezioni previste specifiche. Soprattutto quando si scrive il codice della libreria, questo può essere molto utile per separare le origini delle eccezioni.