Se si utilizza solo l'eccezione generica, non sarà mai possibile intercettare le eccezioni specifiche che sono personalizzate per l'applicazione. Se usi semplicemente
try
{
}
catch (Exception ex)
{
}
Catturerai tutte le eccezioni senza poter filtrare per errori specifici.
Un'altra ragione per cui si crea un'eccezione personalizzata è la gestione di eccezioni specifiche dell'applicazione che possono verificarsi per molte ragioni. Ciò consente di lanciare un'eccezione personalizzata ma personalizzare il messaggio associato all'eccezione. Mi dà anche un altro livello di gestione degli errori che è per la mia specifica applicazione.
Ad esempio, ho un'applicazione di enigenizzazione che dimensiona i sistemi di trasmissione a cinghia. La dll è disponibile anche per altre persone da usare. Ho un'eccezione dell'applicazione che viene generata quando si verifica un errore nella selezione. Il motivo dell'errore può essere dovuto a molti motivi (velocità dell'unità non valida, requisiti di potenza non corretta, ecc.). Poiché ci sono molte ragioni per il fallimento, un'eccezione dell'applicazione personalizzata mi consente di fornire dettagli specifici per l'errore.
Ciò consente anche di documentare agli utenti che le chiamate al metodo generano eccezioni specifiche dell'applicazione che devono essere gestite.
Se la classe di Eccezione ereditaria si assicura di implementare i costruttori nella classe base che hanno un messaggio, messaggio + eccezione interna ed eccezione serializzata.
Ecco un esempio che ho.
/// <summary>
/// Drive error exception class. Thrown when a drive selection error has occured.
/// </summary>
[Serializable]
public class DriveException : ApplicationException
{
/// <summary>
/// Default constructor.
/// </summary>
public DriveException()
{
}
/// <summary>
/// Constructor used with a message.
/// </summary>
/// <param name="message">String message of exception.</param>
public DriveException(string message)
: base(message)
{
}
/// <summary>
/// Constructor used with a message and an inner exception.
/// </summary>
/// <param name="message">String message of exception.</param>
/// <param name="inner">Reference to inner exception.</param>
public DriveException(string message, Exception inner)
: base(message, inner)
{
}
/// <summary>
/// Constructor used in serializing the data.
/// </summary>
/// <param name="info">Data stored to serialize/de-serialize</param>
/// <param name="context">Defines the source/destinantion of the straeam.</param>
public DriveException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
}
fonte
2009-06-23 14:13:20
Sto testando per cose più specifiche di un semplice fuori gamma. Ad esempio, test se un argomento è in uno stato che consente la persistenza. In questo caso si sta controllando un argomento ma si raduna voglio un'eccezione più specifica chiamata ArgumentNotInPersitableState o qualcosa lungo le righe – Sruly
In questo caso particolare erediterei direttamente l'eccezione. –
I tuoi chiamanti cattureranno la tua specifica eccezione? In caso contrario, non è necessario il proprio tipo di eccezione. Basta usare il tuo messaggio. –