Question

J'ai créé une exception personnalisée pour un problème très spécifique qui peut mal tourner.Je reçois des données d'un autre système et je lève l'exception s'il bombarde en essayant d'analyser ces données.Dans mon exception personnalisée, j'ai ajouté un champ appelé "ResponseData", afin de pouvoir suivre exactement ce que mon code ne pouvait pas gérer.

Dans les exceptions personnalisées telles que celle-ci, ces données de réponse supplémentaires doivent-elles être placées dans le « message » d'exception ?Si cela arrive, le message pourrait être énorme.Je le veux en quelque sorte là parce que j'utilise Elmah, et c'est ainsi que je peux accéder à ces données.

La question est donc soit :- Comment puis-je amener Elmah à enregistrer des informations supplémentaires à partir d'un champ dans une exception personnalisée ou - les détails de l'exception supplémentaire devraient-ils entrer dans la propriété "Message"?

Était-ce utile?

La solution

Tu ne devrais pas remplir .Message avec des informations de débogage, mais plutôt avec un morceau de texte concis et utile.

http://msdn.microsoft.com/en-us/library/system.exception.message.aspx

Le texte du message doit décrire complètement l'erreur et doit, lorsque cela est possible, expliquer comment la corriger. La valeur de la propriété Message est incluse dans les informations renvoyées par ToString.

La propriété Message est définie uniquement lors de la création d’une exception.Si aucun message n'a été fourni au constructeur pour l'instance actuelle, le système fournit un message par défaut formaté à l'aide de la culture système actuelle.

[..]

Notes aux héritiers :

La propriété Message est remplacée dans les classes qui nécessitent un contrôle sur le contenu ou le format du message.Le code d'application accède généralement à cette propriété lorsqu'il doit afficher des informations sur une exception interceptée.

Le message d'erreur doit être localisé.

Les données de réponse ne constituent pas une description.

Ne connaissant pas Elmah, je ne peux pas vous dire comment prolonger le Exception classe tout en l’utilisant.Elmah implémente-t-il sa propre sous-classe pour Exception?Ou une interface ?Pouvez-vous le sous-classer vous-même ?

Autres conseils

Dans des exceptions personnalisées comme celle-ci, si les données de réponse supplémentaires devraient entrer dans l'exception "Message"?

Non, comme Sören l'a déjà souligné.Cependant, votre type d'exception pourrait remplacer ToString et ajoutez-y judicieusement les informations sur les données de réponse.Il s'agit d'une pratique parfaitement normale suivie par de nombreux types d'exceptions dans la BCL (Base Class Library), vous ne vous retrouverez donc pas à nager à contre-courant.Par exemple, jetez un œil au System.IO.FileNotFoundException.ToString mise en œuvre dans SSCLI (Rotor):

public override String ToString()
{
    String s = GetType().FullName + ": " + Message;

    if (_fileName != null && _fileName.Length != 0)
        s += Environment.NewLine + String.Format(Environment.GetResourceString("IO.FileName_Name"), _fileName);

    if (InnerException != null)
        s = s + " ---> " + InnerException.ToString();

    if (StackTrace != null)
        s += Environment.NewLine + StackTrace;

    try
    {
        if(FusionLog!=null)
        {
            if (s==null)
                s=" ";
            s+=Environment.NewLine;
            s+=Environment.NewLine;
            s+="Fusion log follows: ";
            s+=Environment.NewLine;
            s+=FusionLog;
        }
    }
    catch(SecurityException)
    {

    }
    return s;
}

Comme vous pouvez le voir, il ajoute le contenu de FusionLog propriété, qui représentent supplémentaire informations en cas de défaillance de charge d'assemblage.

Comment puis-je amener Elmah à enregistrer des informations supplémentaires à partir d'un champ dans une exception personnalisée

ELMAH stocke le résultat de l'appel ToString sur une exception comme détails de l'erreur, donc si vous avez ToString mis en œuvre comme prescrit, les informations seraient enregistrées sans autre travail.Le seul problème est que les détails enregistrés seront non structuré texte.

La classe Exception contient un dictionnaire (nommé Data, je crois) que vous pouvez utiliser pour associer des données personnalisées à une exception Vanilla.

Je ne comprends pas entièrement la question, mais vous semblez vous demander quoi faire avec des données d'exception supplémentaires. Si ce n'est pas votre question, n'hésitez pas à l'ignorer.

Je pense qu'une question importante à poser est la suivante : à quoi sert exactement le message d'exception ?Il ne s'agit pas de savoir d'où vient l'exception, la trace de pile est là pour ça ;il ne s'agit pas d'encapsuler une exception dans une exception plus générale, cela devrait être fait avec le champ InnerException ;dans le cas où votre exception n'est déclenchée qu'à partir d'un endroit particulier de votre code, ce n'est même pas pour décrire le type d'erreur que vous avez eu - c'est à cela que sert le type d'exception.

Généralement, j'utilise le champ de message pour fournir des conseils simples et lisibles par l'homme qu'un programmeur autre que moi, voyant cette erreur pour la première fois, peut utiliser pour comprendre le système sous-jacent.Je considère que le champ de message est approprié pour une courte explication (une phrase), un indice sur la fréquence à laquelle cette erreur est fréquemment générée ou une référence à une lecture plus approfondie.

Donc, pour autant que je comprends votre question, je pense que la meilleure façon de stocker ces « informations supplémentaires » reçues d’un autre système est d’utiliser une InnerException.Je ne connais pas Elmah, mais si cela vaut son sel, il vérifiera les InnerExceptions et les stockera.

Je ne comprends pas la question : vous étendez System.Exception et vous avez déjà ajouté le champ Elmah.C’est là qu’elle appartient : en tant que propriété publique de l’exception elle-même.

Elmah est un module http qui enregistre les exceptions non gérées.

Je suppose que c'est juste une limitation d'Elmah, puisqu'il ne stocke pas les champs personnalisés.Je suppose que je vais devoir demander à ces gars-là.J'ai le champ supplémentaire pour les données de réponse, mais Elmah ne le stocke pas.

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