Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mencegah dan Mengendalikan StackOverflowExceptions dalam Transformasi XSLT?

Bagaimana untuk Mencegah dan Mengendalikan StackOverflowExceptions dalam Transformasi XSLT?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-21 01:46:091001semak imbas

How to Prevent and Handle StackOverflowExceptions in XSLT Transformations?

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:

  1. Buat proses baharu menggunakan kelas Process untuk operasi penukaran.
  2. Tetapkan atribut StartInfo untuk menentukan perhimpunan yang akan dilaksanakan dan dijalankan sebagai proses tersembunyi.
  3. Panggil Start() untuk memulakan penukaran.
  4. Gunakan WaitForExit() untuk menunggu proses penukaran selesai.
  5. Semak atribut 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn