XslTransform 呼び出しでの StackOverflowException の防止と処理
Xsl エディターで XslCompiledTransform.Transform
メソッドを使用すると、ユーザー指定の Xsl スクリプトでの無限再帰により StackOverflowException
が発生する場合があります。この問題を解決するには、次の点を考慮してください:
検出と予防:
Microsoft によると、.NET Framework 2.0 以降、StackOverflowException
は try-catch
ブロックに捕捉できず、プロセスが終了します。したがって、スタック オーバーフローを検出して防止するコードを実装することをお勧めします。
考えられるアプローチの 1 つは、再帰ループを終了するためのカウンターまたはステータス条件を含めることです。ただし、再帰が Xsl スクリプトによって制御されている場合、これは現実的ではない可能性があります。
代替プロセス:
もう 1 つのオプションは、XslTransform コードを別のプロセスに読み込むことです。これにより、メイン アプリケーションに影響を与えることなく、変換プロセスを分離し、例外から回復できます。
これを行うには:
Process
クラスを使用して新しいプロセスを作成します。 StartInfo
属性を設定して、実行するアセンブリを指定し、非表示のプロセスとして実行します。 Start()
を呼び出して変換を開始します。 WaitForExit()
を使用して、変換プロセスが完了するまで待ちます。 ExitCode
属性をチェックして、StackOverflowException
が発生したかどうかを確認します。これが発生した場合、ユーザーにエラーが表示されます。 サンプルコード:
メインプロセス:
<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>
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>
これらのメソッドを実装すると、XslTransform 呼び出しでの無限再帰によって引き起こされる StackOverflowException
を効果的に防止または処理できます。
以上がXSLT 変換で StackOverflowExceptions を防止および処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。