可以从用户代码中抛出StackOverflowException
:
public void Main(){
throw new StackOverflowException();
}
当您尝试捕获它们时,StackOverflowExceptions有interesting qualities。链接文章中的一个示例是有目的地抛出此异常。但是,这似乎不可能。事情发生了变化吗?
编辑:抱歉,我的意思是我在命名空间StackOverflowException
中找不到System
。该链接确实详细说明了CLR可以捕获用户生成的SO异常。
答案 0 :(得分:1)
StackOverflowException是一个异常,不应该由您自己抛出,它会在您的运行时因编程故障而失败时处理特殊情况。在2.0中,运行时为.net运行时抛出的StackOverflowException添加了一些额外的行为:
在.NET Framework的早期版本中,您的应用程序可能会捕获 StackOverflowException对象(例如,要从中恢复) 无限递归)。但是,目前不鼓励这种做法 因为需要大量额外的代码来可靠地捕获a 堆栈溢出异常并继续执行程序。
从.NET Framework 2.0版开始,发生StackOverflowException 对象不能被try-catch块和相应的块捕获 进程默认终止。因此,建议用户 编写代码来检测并防止堆栈溢出。例如, 如果您的应用程序依赖于递归,请使用计数器或状态 条件终止递归循环。请注意一个应用程序 托管公共语言运行库(CLR)可以指定CLR 卸载堆栈溢出异常的应用程序域 发生并让相应的过程继续。更多 信息,请参阅ICLRPolicyManager界面和托管概述。
说明
执行堆栈溢出错误抛出StackOverflowException, 通常在非常深或无限递归的情况下。 Localloc Microsoft中间语言(MSIL)指令抛出 StackOverflowException。
StackOverflowException使用HRESULT COR_E_STACKOVERFLOW,它具有 值0x800703E9。有关a的初始属性值列表 StackOverflowException对象,请参阅StackOverflowException 构造