J'ai du code qui se connecte Exception.Message
. Cependant, j'ai lu un article qui déclare qu'il vaut mieux l'utiliser Exception.ToString()
. Avec ce dernier, vous conservez des informations plus cruciales sur l'erreur.
Est-ce vrai et est-il sûr de continuer et de remplacer tous les enregistrements de code Exception.Message
?
J'utilise également une disposition basée sur XML pour log4net . Est-il possible qu'il Exception.ToString()
puisse contenir des caractères XML non valides, ce qui peut provoquer des problèmes?
Réponses:
Exception.Message
contient uniquement le message (doh) associé à l'exception. Exemple:La
Exception.ToString()
méthode donnera une sortie beaucoup plus détaillée, contenant le type d'exception, le message (d'avant), une trace de pile et toutes ces choses à nouveau pour les exceptions imbriquées / internes. Plus précisément, la méthode renvoie les éléments suivants:la source
En plus de ce qui a déjà été dit, ne l' utilisez pas
ToString()
sur l'objet d'exception pour l'afficher à l'utilisateur. Seule laMessage
propriété devrait suffire, ou un message personnalisé de niveau supérieur.En termes de journalisation, utilisez certainement
ToString()
l'exception, pas seulement laMessage
propriété, comme dans la plupart des scénarios, vous vous laisserez gratter la tête là où cette exception s'est produite et quelle était la pile d'appels. Le stacktrace vous aurait dit tout cela.la source
Conversion de l'intégralité de l'exception en chaîne
L'appel
Exception.ToString()
vous donne plus d'informations que l'utilisation de laException.Message
propriété. Cependant, même cela laisse de côté de nombreuses informations, notamment:Data
propriété de collection trouvée sur toutes les exceptions.Il y a des moments où vous souhaitez capturer ces informations supplémentaires. Le code ci-dessous gère les scénarios ci-dessus. Il écrit également les propriétés des exceptions dans un bel ordre. Il utilise C # 7 mais devrait être très facile pour vous de convertir vers des versions plus anciennes si nécessaire. Voir également cette réponse connexe.
Conseil supérieur - Journalisation des exceptions
La plupart des gens utiliseront ce code pour se connecter. Envisagez d'utiliser Serilog avec mon Serilog. Serilog.Exceptions qui enregistre également toutes les propriétés d'une exception mais le fait plus rapidement et sans réflexion dans la majorité des cas. Serilog est un cadre de journalisation très avancé qui fait fureur au moment de la rédaction.
Astuce - Traces de pile lisibles par l'homme
Vous pouvez utiliser le package Ben.Demystifier NuGet pour obtenir des traces de pile lisibles par l'homme pour vos exceptions ou le package NuGet serilog-enrichers- demystify si vous utilisez Serilog.
la source
Je dirais que @Wim a raison. Vous devez utiliser
ToString()
pour les fichiers journaux - en supposant une audience technique - etMessage
, le cas échéant, pour afficher à l'utilisateur. On pourrait soutenir que même cela ne convient pas à un utilisateur, pour chaque type d'exception et occurrence (pensez à ArgumentExceptions, etc.).En outre, en plus de StackTrace,
ToString()
inclura des informations que vous n'obtiendrez pas autrement. Par exemple, la sortie de fusion, si elle est activée pour inclure les messages de journal dans les "messages" d'exception.Certains types d'exceptions incluent même des informations supplémentaires (par exemple des propriétés personnalisées) dans
ToString()
, mais pas dans le message.la source
Cela dépend des informations dont vous avez besoin. Pour le débogage, la trace de pile et l'exception interne sont utiles:
la source
Exception.ToString()
qui vous donnera, non?StringBuilder
dans ce scénario pourrait bien être plus cher que deux nouvelles allocations de chaînes, c'est très discutable, ce serait plus efficace ici. Ce n'est pas comme s'il s'agissait d'itérations. Chevaux de course.En termes de format XML pour log4net, vous n'avez pas à vous soucier de ex.ToString () pour les journaux. Passez simplement l'objet d'exception lui-même et log4net fait le reste vous donne tous les détails dans son format XML préconfiguré. La seule chose que je rencontre à l'occasion est le nouveau formatage des lignes, mais c'est à ce moment que je lis les fichiers bruts. Sinon, l'analyse du XML fonctionne très bien.
la source
Eh bien, je dirais que cela dépend de ce que vous voulez voir dans les journaux, n'est-ce pas? Si vous êtes satisfait de ce que propose ex.Message, utilisez-le. Sinon, utilisez ex.toString () ou même enregistrez la trace de la pile.
la source