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

È stato utile?

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 ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top