Maison >développement back-end >C++ >Comment relancer correctement les exceptions en C# et préserver la trace de la pile ?

Comment relancer correctement les exceptions en C# et préserver la trace de la pile ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-23 19:01:08473parcourir

How to Properly Rethrow Exceptions in C# and Preserve the Stack Trace?

La méthode correcte de relance des exceptions en C#

Lors de la gestion des exceptions en C#, une syntaxe de relance correcte est cruciale pour garantir l'exactitude des traces de pile. Même si certaines techniques de relance semblent similaires, des différences subtiles peuvent affecter le processus de débogage.

Méthode 1 :

<code class="language-csharp">try
{
    // ...代码块...
}
catch (Exception ex)
{
    // ...处理代码...
    throw;
}</code>

Cette méthode renvoie simplement l'exception capturée sans aucune modification. En règle générale, elle est préférée à la deuxième méthode car elle préserve la trace de pile d'origine, permettant aux développeurs de retracer avec précision l'exception jusqu'à sa source.

Méthode 2 :

<code class="language-csharp">try
{
    // ...代码块...
}
catch (Exception ex)
{
    // ...处理代码...
    throw ex;
}</code>

Bien que cette méthode renvoie également les exceptions, elle peut modifier la trace de la pile. En lançant explicitement une exception interceptée, cela crée un nouveau cadre de pile, masquant la source originale de l'exception, ce qui rend plus difficile l'identification de la cause première.

Utilisez ExceptionDispatchInfo pour renvoyer des exceptions provenant d'autres sources :

Si vous devez relancer une exception à partir d'un contexte différent (comme une exception globale ou un thread séparé), vous devez utiliser la classe ExceptionDispatchInfo. Cette classe capture les informations nécessaires de l'exception d'origine et lui permet d'être renvoyée dans un nouveau contexte tout en conservant sa trace de pile d'origine.

Exemple :

<code class="language-csharp">try
{
    methodInfo.Invoke(...);
}
catch (System.Reflection.TargetInvocationException e)
{
    System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(e.InnerException).Throw();
    throw; // 告知编译器代码流不会离开此代码块
}</code>

En utilisant la classe ExceptionDispatchInfo, le contexte et la trace de pile de l'exception d'origine sont préservés, permettant aux développeurs de retracer avec précision les erreurs jusqu'à leur source.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn