Comment puis-je append un message à une exception sans perdre aucune information en C #?

J’ai le code suivant:

catch(Exception ex) { throw new FatalException("An error occurred while trying to load the XSLT file.", ex); } 

Cela ne fait que ravaler l’exception. Je peux résoudre ce problème en procédant comme suit:

 catch(Exception ex) { throw; } 

Mais je voudrais quand même inclure le message personnalisé pour obtenir de l’aide sur la journalisation des événements.

Comment puis-je append ce message à l’exception sans perdre aucune information? (symboles de trace / débogage de stack, etc.)

Si vous avez juste besoin d’append des informations à l’exception d’origine, comme un message lisible par l’utilisateur ou des détails spécifiques qui vous seront utiles pour détecter l’erreur mais qui ne seront pas utiles à l’utilisateur final, vous pouvez utiliser la propriété Exception’s Data , qui est un dictionnaire de paires clé / valeur.

Nous l’utilisons largement pour enregistrer des informations telles que le rapport en cours d’exécution ou le fichier en cours de traitement afin que les opérations puissent déterminer ce qui se passait exactement au moment de l’erreur. L’utilisateur n’a pas besoin de ce détail car il travaille directement avec la cause de la panne.

Vous pouvez également l’utiliser pour transmettre un message en texte brut à l’utilisateur. Le seul problème est que vous devrez effectuer des tâches supplémentaires dans votre infrastructure de journalisation ou votre interface utilisateur afin d’extraire les données et de les rendre utiles pour le consommateur.

Par exemple, vous pouvez faire:

 catch (Exception ex) { ex.Data.Add("UserMessage", "An error occurred while trying to load the XSLT file."); throw; } 

Ensuite, dans le code côté client, vous pouvez vérifier si UserMessage existe et, si tel est le cas, le présenter à l’utilisateur au lieu de l’exception:

 catch (Exception ex) { if (ex.Data.Contains("UserMessage")) { MessageBox.Show(ex.Data["UserMessage"].ToSsortingng()); } else { MessageBox.Show(ex.Message); } } 

Cette Exception originale est toujours là.

Lorsque vous effectuez votre journalisation d’exception, l’exception que vous recevez sera l’exception FatalEx que vous avez faite avec votre message. L’exception d’origine est dans ex.InnerException . Vous pouvez continuer à parcourir InnerException jusqu’à ce qu’il soit nul pour obtenir toutes les informations de trace de stack, etc.

En bref, non.

Je suis sûr que vous pourriez trouver un moyen de contourner ce problème avec une certaine reflection, mais je vous déconseillerais vivement . Cela va à l’encontre de la conception originale des exceptions dans .NET. Les exceptions ne sont pas là uniquement pour aider à la journalisation, elles fournissent des informations sur la cause initiale d’un échec d’application.

L’utilisation de la première option est généralement préférable car elle conserve la trace de la stack de l’exception d’origine, mais vous permet de fournir des informations supplémentaires en les incluant dans une exception distincte. Dans mon propre code, chaque fois que je journalise des exceptions, ma fonction de journalisation se répète via la propriété InnerException pour trouver toutes les informations utiles possibles sur l’erreur.