XslCompiledTransform での StackOverflowExceptions への対処
Xsl エディターの開発中、StackOverflowException
を呼び出すときに XslCompiledTransform.Transform
が発生すると問題が発生する可能性があります。この例外は通常、無限に再帰的な Xsl スクリプトが原因で発生し、変換中にスタックに負荷がかかります。
Microsoft では、この特定の例外に対して効果のない try-catch
ブロックに依存するのではなく、事前に予防することをお勧めします。 Xsl スクリプト自体内のカウンターまたは状態メカニズムは再帰ループを中断し、スタック オーバーフローを防ぐことができます。
ただし、例外が .NET 内部メソッドから発生した場合は、別の戦略が必要です。
XslTransform
を実行します。 これにより、潜在的なクラッシュが分離され、メイン アプリケーションが続行し、ユーザーに障害が通知されるようになります。変換を別のプロセスに分離するには、メイン アプリケーションで次のコードを使用します。
<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>
別のプロセス (ApplyTransform.exe
) で、次のように例外を処理します。
<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>
この改訂された例は、StackOverflowException
を処理するためのより堅牢かつ明確なソリューションを提供します。 try-catch
の Main
ブロックが StackOverflowException
を明確にキャッチするようになり、UnhandledException
イベント ハンドラーが確実に正常に終了し、「不正な操作」ダイアログの表示を防ぎます。 例の throw new StackOverflowException();
を実際の Xsl 変換コードに置き換えてください。
以上がXslCompiledTransform で StackOverflowExceptions を防止および処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。