C #: ToString Overriding () metodo per eccezioni personalizzate
Domanda
ho una classe di eccezione personalizzata che contiene alcuni campi aggiuntivi. Voglio che questi vengano scritti fuori nel metodo ToString()
, ma se implemento il mio ToString()
, perdo un po 'di altre cose utili (come scrivere il nome del tipo di eccezione, i dati di eccezione interna e l'analisi dello stack).
Qual è il modo migliore / modello per implementare il proprio metodo ToString()
per tali eccezioni? Idealmente dovrebbe riutilizzare il meccanismo esistente, ma essere formattato in modo simile alla implementazione di default ToString()
.
UPDATE: anteponendo o aggiungendo i miei campi personalizzati al testo base.ToString () non è IMHO l'ideale, ad esempio
PimTool.Utilities.OERestServiceUnavailableException: test ---> System.InvalidOperationException: inner message
--- End of inner exception stack trace ---
at PimTool.Tests.Services.OE.OERestClientTests.ExceptionsLogging() in D:\svn\NewPimTool\PimTool.Tests\Services\OE\OERestClientTests.cs:line 178,
StatusCode=0, message='test', requestId='535345'
significa i campi personalizzati vengono scritti alla fine del (potenzialmente lungo) Descrizione eccezione. D'altra parte, voglio che il tipo di eccezione di essere il primo informazioni scritto nella descrizione.
UPDATE 2:. Ho implementato una soluzione per questo, cercare la mia risposta qui sotto
Soluzione 3
Ok, questo è quello che mi si avvicinò con. Ho implementato una classe di estensione che replica il meccanismo originale per la formattazione delle eccezioni, ma con un tocco: un delegato un'azione personalizzata che fornisce un plug-in per la formattazione dei campi personalizzati:
public static class ExceptionFormatterExtensions
{
public static string ExceptionToString (
this Exception ex,
Action<StringBuilder> customFieldsFormatterAction)
{
StringBuilder description = new StringBuilder();
description.AppendFormat("{0}: {1}", ex.GetType().Name, ex.Message);
if (customFieldsFormatterAction != null)
customFieldsFormatterAction(description);
if (ex.InnerException != null)
{
description.AppendFormat(" ---> {0}", ex.InnerException);
description.AppendFormat(
"{0} --- End of inner exception stack trace ---{0}",
Environment.NewLine);
}
description.Append(ex.StackTrace);
return description.ToString();
}
}
Ora è possibile utilizzare questo metodo nel proprio ToString () implementazioni senza duplicare il codice di formattazione:
public override string ToString()
{
return this.ExceptionToString(
description =>
{
description.AppendFormat(
", HttpStatusCode={0}, RequestId='{1}'",
httpStatusCode,
RequestId);
});
}
Altri suggerimenti
Questo è tutto eccessivo. Il tuo eccezione dovrebbe semplicemente ignorare la proprietà Message.
public override String Message {
get {
return base.Message + String.Format(", HttpStatusCode={0}, RequestId='{1}'",
httpStatusCode,
RequestId);
}
}
Il metodo ToString predefinito per la classe Exception è fondamentalmente "ClassName: Message --> InnerException.ToString() StackTrace
". Quindi l'override del messaggio mette il testo del messaggio esattamente dove dovrebbe essere.
Si potrebbe aggiungere manualmente i dati di default per la stringa restituita dalla ToString
, cercando in proprietà di eccezione. Ad esempio, il seguente simulerà i dati restituiti per default con il metodo ToString
di un'eccezione (assumendo non ci sono eccezioni interni):
string.Format("{0}: {1}\r\n{2}", this.GetType().Name, this.Message, this.StackTrace);
In alternativa, si potrebbe semplicemente aggiungere (o anteporre) i dati restituiti dal base.ToString
alle informazioni che si desidera aggiungere.
È possibile eseguire l'override del metodo ToString () per inserire il tuo informazioni personalizzate, e ancora chiamare ToString base predefinita Exception () in questo modo:
public class MyException : Exception
{
public string CustomField { get; set; }
public override string ToString()
{
return CustomField + Environment.NewLine + base.ToString();
}
}
Se stai principalmente a guardarli nel debugger, quindi è possibile utilizzare l'attributo [DebuggerDisplay]
per specificare la formattazione e non toccare il metodo ToString
esistente.
In caso contrario, solo sovraccaricare ToString
ed essere sicuri di chiamare la versione della classe base base.ToString()
All'interno della base.ToString chiamata di override () e modificare la stringa risultante alle vostre esigenze ...