Maison >développement back-end >C++ >Comment puis-je conserver les traces de pile lors de la nouvelle émission d'exceptions en C# ?

Comment puis-je conserver les traces de pile lors de la nouvelle émission d'exceptions en C# ?

DDD
DDDoriginal
2025-01-17 07:06:09180parcourir

How Can I Preserve Stack Traces When Rethrowing Exceptions in C#?

Préserver la trace de la pile lors du renvoi d'une exception interne en C#

Bien qu'il soit courant de relancer InnerException pour transmettre l'exception sous-jacente à l'appelant, cela peut accidentellement supprimer des informations précieuses sur la trace de la pile, entravant ainsi les efforts de débogage.

En C#, lorsqu'une méthode est appelée via réflexion et qu'une exception se produit, une TargetInvocationException est levée en tant que wrapper autour de l'exception réelle. Pour récupérer une exception interne, les développeurs se contentent souvent de la relancer. Cependant, cette opération effacera les informations de trace de pile pointant vers la véritable source de l'erreur.

Solution utilisant ExceptionDispatchInfo

Depuis .NET 4.5, la classe ExceptionDispatchInfo apporte une solution à ce problème. Il permet d'intercepter une exception et de la relancer tout en conservant sa trace de pile. Voici comment l'utiliser :

<code class="language-csharp">using ExceptionDispatchInfo = 
    System.Runtime.ExceptionServices.ExceptionDispatchInfo;

try
{
    // 执行可能抛出异常的方法。
    task.Wait();
}
catch (AggregateException ex)
{
    // 捕获内部异常并使用原始堆栈跟踪重新抛出它。
    ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}</code>

Cette méthode est particulièrement utile lors du déballage des exceptions internes d’une instance AggregateException après avoir utilisé la fonctionnalité du langage wait C#. Il garantit que les informations de trace de la pile ne sont pas perdues lors de la programmation asynchrone.

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