Traitement des exceptions StackOverflow dans XslCompiledTransform
Lors du développement de Xsl Editor, rencontrer un StackOverflowException
lors de l'appel de XslCompiledTransform.Transform
peut être problématique. Cette exception provient généralement d'un script Xsl infiniment récursif, submergeant la pile lors de la transformation.
Microsoft recommande une prévention proactive au lieu de s'appuyer sur des try-catch
blocages, qui sont inefficaces contre cette exception spécifique. Un mécanisme de compteur ou d'état au sein du script Xsl lui-même peut interrompre les boucles récursives, empêchant ainsi le débordement de pile.
Cependant, si l'exception provient d'une méthode interne .NET, des stratégies alternatives sont nécessaires :
XslTransform
dans un processus distinct. Cela isole le crash potentiel, permettant à l'application principale de continuer et d'informer l'utilisateur de l'échec.Pour isoler la transformation en un processus distinct, utilisez ce code dans votre application principale :
<code class="language-csharp">// Example demonstrating argument passing in StartInfo 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("A StackOverflowException occurred.");</code>
Dans le processus séparé (ApplyTransform.exe
), gérez l'exception comme ceci :
<code class="language-csharp">class Program { static void Main(string[] args) { AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; try { //Your XslTransform code here throw new StackOverflowException(); //Example - Replace with your actual transform code } catch (StackOverflowException) { Environment.Exit(1); } } static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { if (e.IsTerminating) { Environment.Exit(1); } } }</code>
Cet exemple révisé fournit une solution plus robuste et plus claire pour gérer le StackOverflowException
. Le bloc try-catch
dans Main
intercepte désormais spécifiquement le StackOverflowException
et le gestionnaire d'événements UnhandledException
assure une sortie propre, empêchant la boîte de dialogue « Opération illégale ». N'oubliez pas de remplacer l'exemple throw new StackOverflowException();
par votre code de transformation Xsl réel.
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!