use*_*667 10 c# recursion exception-handling
我不需要从递归到非递归方式的课程,我只是想知道为什么我们不能处理这种类型的异常.无论如何,我在非常大的列表上使用递归函数.
我编写了代码来尝试捕获StackOverFlowExceptions:
try { recursiveFxn(100000); }
catch(Exception){}Run Code Online (Sandbox Code Playgroud)
private void recursiveFxn(int countdown)
{
if (countdown > 0)
recursiveFxn(countdown - 1);
else
throw new Exception("lol. Forced exception.");
}Run Code Online (Sandbox Code Playgroud)
但是我仍然遇到程序崩溃(在NUnit和我正在运行的网页中).为什么不抓住例外?
Dan*_*ker 16
自.NET Framework 2.0以来,StackOverflowException无法捕获.这是因为它被认为是一种不好的做法.引用MSDN文档:
从.NET Framework 2.0版开始,
StackOverflowExceptiontry-catch块无法捕获对象,默认情况下会终止相应的进程.因此,建议用户编写代码以检测并防止堆栈溢出.例如,如果您的应用程序依赖于递归,请使用计数器或状态条件来终止递归循环.
现在,捕获a的唯一方法StackOverflowException是用户代码抛出它,正如Jared Parsons在博客中所解释的那样.除此之外,通过托管CLR,您可以处理(但不能捕获)StackOverflowException并设计一种方法来继续执行程序.
请注意,因为当发生异常时堆栈被展开,在.Net的2.0版本之前,堆栈实际上会在StackOverflowException处理时更短,从而可以在不生成另一个堆栈的情况下执行此操作StackOverflowException.