XslTransform 호출에서 StackOverflowException 방지 및 처리
Xsl 편집기에서 XslCompiledTransform.Transform
메서드를 사용할 때 사용자 제공 Xsl 스크립트의 무한 재귀로 인해 StackOverflowException
이 발생할 수 있습니다. 이 문제를 해결하려면 다음을 고려하십시오.
탐지 및 예방:
Microsoft에 따르면 .NET Framework 2.0부터 StackOverflowException
는 try-catch
블록에 포착될 수 없으며 프로세스가 종료됩니다. 따라서 스택 오버플로를 감지하고 방지하는 코드를 구현하는 것이 좋습니다.
한 가지 가능한 접근 방식은 재귀 루프를 종료하기 위해 카운터 또는 상태 조건을 포함하는 것입니다. 그러나 재귀가 Xsl 스크립트에 의해 제어되는 경우에는 실용적이지 않을 수 있습니다.
대체 프로세스:
또 다른 옵션은 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 변환에서 StackOverflowException을 방지하고 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!