Se il lancio System.Exception
è considerato così male, perché non è stato Exception
fatto abstract
in primo luogo?
In questo modo, non sarebbe possibile chiamare:
throw new Exception("Error occurred.");
Ciò imporrebbe l'uso di eccezioni derivate per fornire maggiori dettagli sull'errore che si è verificato.
Ad esempio, quando voglio fornire una gerarchia di eccezioni personalizzata per una libreria, di solito dichiaro una classe base astratta per le mie eccezioni:
public abstract class CustomExceptionBase : Exception
{
/* some stuff here */
}
E poi alcune eccezioni derivate con uno scopo più specifico:
public class DerivedCustomException : CustomExceptionBase
{
/* some more specific stuff here */
}
Quindi quando si chiama qualsiasi metodo di libreria, si potrebbe avere questo generico blocco try / catch per rilevare direttamente qualsiasi errore proveniente dalla libreria:
try
{
/* library calls here */
}
catch (CustomExceptionBase ex)
{
/* exception handling */
}
È una buona pratica?
Sarebbe bello se Exception
fosse reso astratto?
EDIT: Il mio punto qui è che anche se una classe di eccezione è contrassegnata abstract
, puoi ancora prenderla in un blocco catch-all. Renderlo astratto è solo un modo per vietare ai programmatori di lanciare un'eccezione "super ampia". Di solito, quando si lancia volontariamente un'eccezione, è necessario sapere che tipo è e perché è successo. Pertanto, imponendo di lanciare un tipo di eccezione più specifico.