Con il nostro SDK pubblico, tendiamo a voler inviare messaggi molto informativi sul perché si verifica un'eccezione. Per esempio:
if (interfaceInstance == null)
{
string errMsg = string.Format(
"Construction of Action Argument: {0}, via the empty constructor worked, but type: {1} could not be cast to type {2}.",
ParameterInfo.Name,
ParameterInfo.ParameterType,
typeof(IParameter)
);
throw new InvalidOperationException(errMsg);
}
Tuttavia, ciò tende a ingombrare il flusso del codice, in quanto tende a concentrarsi molto sui messaggi di errore piuttosto che su ciò che il codice sta facendo.
Un collega ha iniziato a refactoring alcune delle eccezioni lanciate a qualcosa del genere:
if (interfaceInstance == null)
throw EmptyConstructor();
...
private Exception EmptyConstructor()
{
string errMsg = string.Format(
"Construction of Action Argument: {0}, via the empty constructor worked, but type: {1} could not be cast to type {2}.",
ParameterInfo.Name,
ParameterInfo.ParameterType,
typeof(IParameter)
);
return new InvalidOperationException(errMsg);
}
Ciò rende la logica del codice più semplice da comprendere, ma aggiunge molti altri metodi per gestire gli errori.
Quali sono altri modi per evitare il problema "logica di disordine dei messaggi di eccezione lunga"? Sto principalmente chiedendo idiomatico C # /. NET, ma anche come altre lingue lo gestiscono sono utili.
[Modificare]
Sarebbe bello avere anche i pro e i contro di ogni approccio.
Exception.Data
proprietà, rilevazione dell'eccezione "esigente", chiamata della cattura del codice e aggiunta del proprio contesto, insieme allo stack di chiamate acquisite, forniscono tutte informazioni che dovrebbero consentire messaggi molto meno dettagliati. Infine System.Reflection.MethodBase
sembra promettente per fornire dettagli da passare al metodo di "costruzione delle eccezioni".
Exception.Data
. L'enfasi dovrebbe essere catturare la telemetria. Il refactoring qui va bene, ma manca il problema.