Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mencegah dan Mengendalikan StackOverflowExceptions dalam Transformasi XSLT?
Mencegah dan mengendalikan StackOverflowException dalam panggilan XslTransform
Rekursi tak terhingga dalam skrip Xsl yang dibekalkan pengguna mungkin menghasilkan XslCompiledTransform.Transform
apabila menggunakan kaedah StackOverflowException
dalam editor Xsl. Untuk menyelesaikan isu ini, pertimbangkan perkara berikut:
Pengesanan dan Pencegahan:
Menurut Microsoft, bermula dengan .NET Framework 2.0, StackOverflowException
tidak boleh ditangkap dalam blok try-catch
dan menyebabkan proses ditamatkan. Oleh itu, adalah disyorkan untuk melaksanakan kod untuk mengesan dan mencegah limpahan tindanan.
Satu pendekatan yang mungkin adalah dengan memasukkan pembilang atau keadaan status untuk menamatkan gelung rekursif. Walau bagaimanapun, ini mungkin tidak praktikal jika rekursi dikawal oleh skrip Xsl.
Proses alternatif:
Pilihan lain ialah memuatkan kod XslTransform ke dalam proses yang berasingan. Ini membolehkan anda mengasingkan proses penukaran dan pulih daripada sebarang pengecualian tanpa menjejaskan aplikasi utama anda.
Untuk melakukan ini:
Process
untuk operasi penukaran. StartInfo
untuk menentukan perhimpunan yang akan dilaksanakan dan dijalankan sebagai proses tersembunyi. Start()
untuk memulakan penukaran. WaitForExit()
untuk menunggu proses penukaran selesai. ExitCode
untuk menentukan sama ada StackOverflowException
berlaku. Jika ini berlaku, ralat dipaparkan kepada pengguna. Kod sampel:
Proses utama:
<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>
Proses 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>
Dengan melaksanakan kaedah ini, anda boleh mencegah atau mengendalikan dengan berkesan StackOverflowException
yang disebabkan oleh rekursi tak terhingga dalam panggilan XslTransform.
Atas ialah kandungan terperinci Bagaimana untuk Mencegah dan Mengendalikan StackOverflowExceptions dalam Transformasi XSLT?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!