Tipo super eccezionale di eccezioni

17

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.

    
posta marco-fiset 14.11.2011 - 15:11
fonte

2 risposte

11

Non conosco le reali ragioni per cui è stato fatto in questo modo, e ad un livello superiore sono d'accordo sul fatto che evitare eccezioni eccezionalmente ampie di essere gettate sarebbe una buona cosa.

MA ... quando si codificano piccole app demo o proof-of-concept, non voglio iniziare a progettare 10 diverse sotto-classi di eccezioni, né a dedicare del tempo a decidere quale sia la "migliore" classe di eccezioni per situazione. Preferisco semplicemente lanciare Exception e passare una stringa che spiega i dettagli. Quando si tratta di un codice a eliminazione diretta, non mi importa di queste cose e se fossi forzato a preoccuparsi di queste cose, creerei la mia classe GenericException e lancerei che ovunque, o passare a un altro strumento / lingua. Per alcuni progetti, sono d'accordo sul fatto che la creazione corretta di sottoclassi di eccezioni rilevanti sia importante, ma non tutti i progetti lo richiedono.

    
risposta data 14.11.2011 - 17:44
fonte
3

Possibilità A: è logicamente corretto.

Hai ragione che Microsoft, insieme a molti altri, non suggerisce di lanciare un new Exception() direttamente per una pletora di ragioni.

Detto questo, possiamo considerare l'ideale accademica che lo scopo di una gerarchia di classi% il% co_de è quello di definire un effetto di restringimento in modo che solo le eccezioni più specifiche possono essere catturati. (cioè Exception è più stretto di ArgumentNullException ).

La classe Exception non fa eccezione (pun not intended). È inteso essere l'eccezione più ampia possibile, una "super eccezione" che quasi non può essere catturata perché il suo ambito è infinitamente ampio. 'Eccezione' non è ArgumentException nel senso che Eccezione non può esistere come entità a sé stante. Può (anche se, ovviamente, non esistono ancora buoni casi definiti - vedi possibilità B), e quindi dovrebbe essere pubblicamente costruibile.

La parola chiave "astratta" (in senso puramente accademico) è applicabile solo quando la classe base non ha senso da sola - cioè abstract .

Tutto questo in mente, non ci sarebbe tecnica motivo per rendere la classe FourLeggedAnimal , altro che essere una fonte di aggravamento per gli sviluppatori .

Possibilità B: Design Lock-in / Non sapevano

Se MS ha reso questa classe astratta, potrebbe essere stato nei guai se avessero cambiato idea, perché questa classe è molto essenziale per i fondamenti della lingua. Hanno già provato una scappatoia con abstract , quindi è prevedibile che abbiano anticipato anche un cambiamento nelle raccomandazioni lungo la strada. (vedi link )

Ci possono essere altri motivi (penso forse questo ha a che fare con la riflessione, o qualche altro motivo tecnico), quindi sto facendo questo post un CW.

    
risposta data 14.11.2011 - 17:59
fonte

Leggi altre domande sui tag