Meilleures pratiques de gestion des exceptions .NET : préserver les traces de pile et InnerException
Dans la gestion des exceptions, le respect des meilleures pratiques est essentiel pour garantir un suivi et une récupération appropriés des erreurs. Un aspect à considérer est de conserver l’InnerException et la trace de pile de l’exception d’origine lors de la nouvelle exécution de l’exception.
Considérez les deux blocs de code suivants :
<code class="language-csharp">try { //某些代码 } catch (Exception ex) { throw ex; // 这种方式会保留原始异常信息,但会丢失调用堆栈信息的一部分 }</code>
<code class="language-csharp">try { //某些代码 } catch (Exception ex) { throw; // 这种方式会保留完整的调用堆栈信息 }</code>
À première vue, ces deux blocs de code semblent similaires. Il existe cependant des différences subtiles. Le premier bloc de code renvoie explicitement l'exception interceptée, garantissant ainsi que l'InnerException et la trace de la pile sont préservées. Le deuxième bloc de code utilise l'abréviation « throw ; » sans spécifier l'exception interceptée, qui écrase la trace de pile actuelle.
Pour préserver les traces de pile, il est recommandé d'utiliser la syntaxe "throw;" sans spécifier d'exception. Cela permet à la trace de pile de l'exception d'origine d'être propagée à l'appelant.
Vous pouvez également renvoyer explicitement l'exception et sa trace de pile d'origine en utilisant le format suivant :
<code class="language-csharp">try { // 这里发生错误的代码 } catch (Exception ex) { throw; // 保留完整的堆栈跟踪 }</code>
N'oubliez pas que c'est une bonne pratique de transmettre l'exception d'origine en tant que paramètre lors de la nouvelle exécution de l'exception. Cela permet de propager des informations supplémentaires et facilite le débogage. Il est plus recommandé d'utiliser throw;
au lieu de throw ex;
pour conserver les informations complètes de trace de la pile. Si vous devez ajouter des informations contextuelles supplémentaires lors de la nouvelle émission d'une exception, vous pouvez créer un nouvel objet d'exception et transmettre l'exception d'origine sous la forme InnerException
.
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!