Se il lancio di System.Exception
è considerato così negativo, perché non era Exception
fatto abstract
in primo luogo?
In questo modo, non sarebbe possibile chiamare:
throw new Exception("Error occurred.");
Ciò imporrebbe l'utilizzo 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 qualche eccezione derivata con uno scopo più specifico:
public class DerivedCustomException : CustomExceptionBase
{
/* some more specific stuff here */
}
Quindi quando si chiama un qualsiasi metodo di libreria, si potrebbe avere questo blocco try / catch generico per catturare direttamente qualsiasi errore proveniente dalla libreria:
try
{
/* library calls here */
}
catch (CustomExceptionBase ex)
{
/* exception handling */
}
Questa è una buona pratica?
Sarebbe positivo se Exception
fosse stato reso astratto?
EDIT: Il mio punto qui è che anche se una classe di eccezioni è contrassegnata con abstract
, è ancora possibile catturarla in un blocco catch-all. Renderlo astratto è solo un modo per proibire ai programmatori di lanciare un'eccezione "super-wide". Di solito, quando si fa volontariamente un'eccezione, è necessario sapere di che tipo si tratta e perché è successo. In tal modo impone di lanciare un tipo di eccezione più specifico.