从用户代码中抛出stackoverflow

时间:2014-07-04 14:35:39

标签: c# exception

可以从用户代码中抛出StackOverflowException

public void Main(){
    throw new StackOverflowException();
}

当您尝试捕获它们时,StackOverflowExceptions有interesting qualities。链接文章中的一个示例是有目的地抛出此异常。但是,这似乎不可能。事情发生了变化吗?

编辑:抱歉,我的意思是我在命名空间StackOverflowException中找不到System。该链接确实详细说明了CLR可以捕获用户生成的SO异常。

1 个答案:

答案 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   构造

system.stackoverflowexception(MSDN)