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.
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!