c# – 如何防止和/或处理StackOverflowException?

我想要么防止或处理一个StackOverflowException,我从调用XslCompiledTransform.Transform方法在我写的Xsl编辑器中。问题似乎是,用户可以编写一个无限递归的Xsl脚本,它只是在调用Transform方法时出现。 (也就是说,问题不仅仅是典型的程序错误,这通常是这种异常的原因。)

有没有办法检测和/或限制允许多少个递归?还是任何其他的想法,保持这个代码只是吹了我?

最佳答案
来自Microsoft:

Starting with the .NET Framework
version 2.0, a StackOverflowException
object cannot be caught by a try-catch
block and the corresponding process is
terminated by default. Consequently,
users are advised to write their code
to detect and prevent a stack
overflow. For example, if your
application depends on recursion, use
a counter or a state condition to
terminate the recursive loop.

我假设异常发生在内部的.NET方法,而不是在你的代码。

你可以做几件事。

>编写代码,检查xsl是否为无限递归,并在应用变换(Ugh)之前通知用户。
>将XslTransform代码加载到单独的进程(Hacky,但工作量较少)。

您可以使用Process类来加载将转换应用于单独进程的程序集,并在失败时警告用户该失败,而不会终止您的主应用程序。

编辑:我刚刚测试过,这里是怎么做的:

主程序:

// This is just an example, obviously you'll want to pass args to this.
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");

ApplyTransform过程:

class Program
{
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        throw new StackOverflowException();
    }

    // We trap this, we can't save the process, 
    // but we can prevent the "ILLEGAL OPERATION" window 
    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        if (e.IsTerminating)
        {
            Environment.Exit(1);
        }
    }
}

转载注明原文:c# – 如何防止和/或处理StackOverflowException? - 代码日志