Quando si tratta di eccezioni personalizzate, di solito ereditano da Exception e quindi aggiungere alcuni campi/proprietà alla mia classe di eccezione per memorizzare alcune informazioni aggiuntive:Come devo archiviare i dati all'interno di eccezioni personalizzate?
public class MyException : Exception
{
public int ErrorCode{get;set;}
public MyException()
{}
}
Nell'esempio precedente, il valore ErrorCode
viene memorizzato nella un'eccezione , il che significa che devo aggiungerlo e ritirarlo se dall'oggetto SerializationInfo
nel costruttore protetto e il metodo sostituito da GetObjectData
.
La classe Exception ha una proprietà Data, che secondo MSDN:
Ottiene un insieme di coppie chiave/valore che forniscono informazioni definite dall'utente ulteriori circa l'eccezione.
Se devo conservare il codice di errore all'interno del Data
, otterrà serializzato per me dalla classe Exception (secondo Reflector), il che significa che la mia classe di eccezione ora assomiglia:
public class MyException : Exception
{
public int ErrorCode
{
get {return (int) Data["ErrorCode"];}
set {Data["ErrorCode"] = value;}
}
public MyException()
{}
}
Questo significa che mentre c'è ancora un po 'di lavoro da fare nell'affrontare il get/set del codice di errore (come affrontare gli errori di casting e le situazioni in cui il codice di errore potrebbe non essere nel dizionario), non devo preoccuparmi di serializzare/deserializzandolo.
Questo è solo due diversi modi per ottenere la stessa cosa, o in un modo si hanno dei vantaggi chiari rispetto all'altro (a parte quelli che ho già menzionato)?