Maison >développement back-end >C++ >Comment prévenir et gérer les exceptions StackOverflowExceptions dans les transformations XSLT ?

Comment prévenir et gérer les exceptions StackOverflowExceptions dans les transformations XSLT ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-21 01:46:09951parcourir

How to Prevent and Handle StackOverflowExceptions in XSLT Transformations?

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 :

  1. Créez un nouveau processus en utilisant la classe Process pour l'opération de conversion.
  2. Définissez l'attribut StartInfo pour spécifier l'assembly à exécuter et à exécuter en tant que processus caché.
  3. Appelez Start() pour démarrer la conversion.
  4. Utilisez WaitForExit() pour attendre la fin du processus de conversion.
  5. Vérifiez l'attribut 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!

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