Prévention et gestion de StackOverflowException dans les appels XslTransform
Une récursivité infinie dans le script Xsl fourni par l'utilisateur peut entraîner XslCompiledTransform.Transform
lors de l'utilisation de la méthode StackOverflowException
dans un éditeur XSl. Pour résoudre ce problème, considérez ce qui suit :
Détection et prévention :
Selon Microsoft, à partir de .NET Framework 2.0, StackOverflowException
ne peut pas être pris dans un bloc try-catch
et entraîne l'arrêt du processus. Par conséquent, il est recommandé d’implémenter du code pour détecter et empêcher les débordements de pile.
Une approche possible consiste à inclure un compteur ou une condition d'état pour terminer la boucle récursive. Cependant, cela peut ne pas être pratique si la récursivité est contrôlée par un script Xsl.
Procédure alternative :
Une autre option consiste à charger le code XslTransform dans un processus distinct. Cela vous permet d'isoler le processus de conversion et de récupérer de toute exception sans affecter votre application principale.
Pour ce faire :
Process
pour l'opération de conversion. StartInfo
pour spécifier l'assembly à exécuter et à exécuter en tant que processus caché. Start()
pour démarrer la conversion. WaitForExit()
pour attendre la fin du processus de conversion. ExitCode
pour déterminer si StackOverflowException
s'est produit. Si cela se produit, une erreur est affichée à l'utilisateur. Exemple de code :
Processus principal :
<code class="language-csharp">Process p1 = new Process(); p1.StartInfo.FileName = "ApplyTransform.exe"; p1.StartInfo.UseShellExecute = false; p1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; p1.Start(); p1.WaitForExit(); if (p1.ExitCode == 1) Console.WriteLine("StackOverflow was thrown");</code>
Processus ApplyTransform :
<code class="language-csharp">class Program { static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); throw new StackOverflowException(); } // 处理未处理的异常并以退出代码 1 退出 static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { if (e.IsTerminating) { Environment.Exit(1); } } }</code>
En implémentant ces méthodes, vous pouvez prévenir ou gérer efficacement StackOverflowException
provoqué par une récursivité infinie dans les appels XslTransform.
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!