Question

J'ai une classe d'exception personnalisée qui contient des champs supplémentaires. Je veux que ces à écrire dans la méthode ToString(), mais si je mets en œuvre mon ToString(), je lâche quelques autres trucs utiles (comme écrire le nom du type d'exception, les données d'exception interne et la trace de la pile).

Quelle est la meilleure façon / modèle à mettre en œuvre votre propre méthode de ToString() pour ces exceptions? Idéalement, il devrait réutiliser le mécanisme existant, mais être formaté de manière similaire à la mise en œuvre de ToString() par défaut.

MISE À JOUR: préfixer ou mes champs annexant personnalisés au texte base.ToString () n'est pas à mon humble avis idéal, par exemple

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'

signifie que les champs personnalisés sont écrits à la fin de la (potentiellement longue) Description d'exception. D'autre part, je veux que le type d'exception à être la première information écrite dans la description.

MISE À JOUR 2:. J'ai mis en place une solution pour cela, chercher ma réponse ci-dessous

Était-ce utile?

La solution 3

OK, voici ce que je suis venu avec. J'ai mis en place une classe d'extension qui reproduit le mécanisme original de mise en forme des exceptions, mais avec une torsion: un délégué d'action personnalisé qui fournit un plug-in pour le formatage des champs personnalisés:

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();
    }
}

Maintenant, vous pouvez utiliser cette méthode dans votre propre implémentation ToString () sans dupliquer le code de formatage:

    public override string ToString()
    {
        return this.ExceptionToString(
            description =>
            {
                description.AppendFormat(
                    ", HttpStatusCode={0}, RequestId='{1}'", 
                    httpStatusCode, 
                    RequestId);
            });
    }

Autres conseils

Tout cela est exagéré. Votre exception devrait simplement ignorer le message de la propriété.

public override String Message {
    get {  
        return base.Message + String.Format(", HttpStatusCode={0}, RequestId='{1}'", 
                    httpStatusCode, 
                    RequestId);
    }
}

La méthode ToString par défaut pour la classe d'exception est essentiellement « ClassName: Message --> InnerException.ToString() StackTrace ». impérieuses Donc, le message met votre message texte exactement où il devrait être.

Vous pouvez ajouter manuellement les données par défaut à la chaîne retournée par ToString, en regardant les propriétés d'exception. Par exemple, ce qui suit simulera les données renvoyées par défaut par une méthode de ToString d'exception (en supposant qu'il n'y a pas d'exceptions intérieures):

string.Format("{0}: {1}\r\n{2}", this.GetType().Name, this.Message, this.StackTrace);

Ou, vous pouvez simplement ajouter (ou précédez) les données renvoyées par base.ToString aux informations que vous souhaitez ajouter.

Vous pouvez remplacer la méthode ToString () pour inclure vos propres informations personnalisées, et toujours appeler la base par défaut Exception ToString () comme ceci:

public class MyException : Exception
{
    public string CustomField { get; set; }
    public override string ToString()
    {
        return CustomField + Environment.NewLine + base.ToString();
    }
}

Si vous cherchez avant tout à eux dans le débogueur, vous pouvez utiliser l'attribut [DebuggerDisplay] pour indiquer leur mise en forme et ne pas toucher la méthode ToString existante.

Dans le cas contraire, la surcharge juste ToString et assurez-vous d'appeler la version classe de base base.ToString()

A l'intérieur du base.ToString d'appel prioritaire () et modifier la chaîne résultante à vos besoins ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top