C#捕获堆栈溢出异常

我得到了一个抛出堆栈溢出异常的方法的递归调用。 第一个调用被try catch块包围,但没有捕获异常。

堆栈溢出异常是否以特殊方式运行? 我可以正确捕获/处理异常吗?

注意:如果相关:

主线程中没有抛出异常

代码抛出异常的对象由Assembly.LoadFrom(...)手动加载.CreateInstance(...)

9个解决方案

99 votes

从2.0开始,只能在以下情况下捕获StackOverflow异常。

CLR正在托管环境*中运行,其中主机特别允许处理StackOverflow异常

用户代码抛出stackoverflow异常,而不是由于实际的堆栈溢出情况(参考)

*“托管环境”,如“我的代码主机CLR和我配置CLR的选项”而不是“我的代码在共享主机上运行”

JaredPar answered 2019-07-27T21:16:35Z

44 votes

正确的方法是修复溢出,但....

你可以给自己一个更大的堆栈: -

using System.Threading;

Thread T = new Thread(threadDelegate, stackSizeInBytes);

T.Start();

您可以使用System.Diagnostics.StackTrace FrameCount属性来计算您使用的帧,并在达到帧限制时抛出您自己的异常。

或者,您可以计算剩余堆栈的大小,并在低于阈值时抛出您自己的异常: -

class Program

{

static int n;

static int topOfStack;

const int stackSize = 1000000; // Default?

// The func is 76 bytes, but we need space to unwind the exception.

const int spaceRequired = 18*1024;

unsafe static void Main(string[] args)

{

int var;

topOfStack = (int)&var;

n=0;

recurse();

}

unsafe static void recurse()

{

int remaining;

remaining = stackSize - (topOfStack - (int)&remaining);

if (remaining < spaceRequired)

throw new Exception("Cheese");

n++;

recurse();

}

}

抓住奶酪吧。;)

answered 2019-07-27T21:17:26Z

36 votes

从StackOverflowExceptions上的MSDN页面:

在.NET的早期版本中   框架,您的应用程序可以   捕获StackOverflowException对象   (例如,从中恢复   无限递归)。 但是,那   目前不鼓励练习   因为重要的额外代码是   需要可靠地捕获堆栈   溢出异常并继续   程序执行。

从.NET Framework开始   版本2.0,StackOverflowException   try-catch无法捕获对象   块和相应的过程是   默认终止。 所以,   建议用户编写代码   检测和防止堆栈   溢出。 例如,如果你的   应用程序取决于递归,使用   反击或国家条件   终止递归循环。 注意   托管的应用程序   公共语言运行库(CLR)可以   指定CLR卸载   应用程序域所在的堆栈   溢出异常发生并让   相应的过程继续。 对于   更多信息,请参阅   ICLRPolicyManager接口和   托管公共语言运行时。

Damien_The_Unbeliever answered 2019-07-27T21:18:05Z

20 votes

正如几位用户已经说过的那样,你无法捕获异常。 但是,如果您正在努力找出它发生的位置,您可能希望配置visual studio以便在它被抛出时中断。

为此,您需要从“调试”菜单中打开“异常设置”。 在旧版本的Visual Studio中,这是'Debug' - 'Exceptions'; 在较新的版本中,它位于'Debug' - 'Windows' - 'Exception Settings'。

打开设置后,展开“Common Language Runtime Exceptions”,展开“System”,向下滚动并选中“System.StackOverflowException”。 然后你可以查看调用堆栈并查找重复的调用模式。 这应该让你知道在哪里寻找修复导致堆栈溢出的代码。

Simon answered 2019-07-27T21:18:44Z

14 votes

如上所述,由于进程状态损坏,无法捕获由系统引发的StackOverflowException。 但有一种方法可以将异常视为事件:

[http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx]

从.NET Framework版本4开始,不会针对损坏进程状态的异常(例如堆栈溢出或访问冲突)引发此事件,除非事件处理程序是安全关键的并且具有HandleProcessCorruptedStateExceptionsAttribute属性。

然而,你的应用程序将在退出事件功能后终止(一个非常脏的解决方法,是在这个事件中重新启动应用程序哈哈,没有这样做,也永远不会这样做)。 但这对于伐木来说已经足够了!

在.NET Framework 1.0和1.1版中,运行时捕获在主应用程序线程以外的线程中发生的未处理异常,因此不会导致应用程序终止。 因此,可以在不终止应用程序的情况下引发UnhandledException事件。 从.NET Framework 2.0版开始,删除了子线程中未处理异常的这一支持,因为此类静默故障的累积影响包括性能下降,数据损坏和锁定,所有这些都难以调试。 有关更多信息,包括运行时未终止的案例列表,请参阅托管线程中的例外。

FooBarTheLittle answered 2019-07-27T21:19:37Z

6 votes

是的CLR 2.0堆栈溢出被认为是不可恢复的情况。 所以运行时仍然关闭了进程。

有关详细信息,请参阅文档[http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx]

Brian Rasmussen answered 2019-07-27T21:20:08Z

5 votes

你不能。 CLR不会让你。 堆栈溢出是致命错误,无法从中恢复。

Matthew Scharley answered 2019-07-27T21:20:32Z

5 votes

您不能像大多数帖子那样解释,让我添加另一个区域:

在许多网站上,您会发现人们说避免这种情况的方法是使用不同的AppDomain,因此如果发生这种情况,域名将被卸载。 这是绝对错误的(除非您托管您的CLR)因为CLR的默认行为将引发KillProcess事件,从而关闭您的默认AppDomain。

No hay Problema answered 2019-07-27T21:21:03Z

3 votes

这是不可能的,并且有充分的理由(对于一个人来说,考虑所有那些捕获(例外){}。

如果要在堆栈溢出后继续执行,请在其他AppDomain中运行危险代码。 可以将CLR策略设置为在溢出时终止当前AppDomain而不影响原始域。

ima answered 2019-07-27T21:21:33Z

c# 溢出抛异常_C#捕获堆栈溢出异常相关推荐

  1. c# 溢出抛异常_C#捕获堆栈溢出exception

    从2.0开始,StackOverflowexception只能在以下情况下被捕获. CLR正在宿主环境中运行,主机特别允许处理StackOverflowexception 用户代码抛出stackove ...

  2. python 堆栈溢出_内存 - 如何发生“堆栈溢出”,如何防止它?

    堆 在此上下文中,堆栈是在程序运行时放置数据的最后进先出缓冲区. 最后一次出来(LIFO)意味着你输入的最后一件事总是你要退回的第一件事 - 如果你在堆叠上推2个项目,'A'然后'B',那么你首先要弹 ...

  3. 一段堆栈溢出的代码_为什么堆栈溢出的代码片段会破坏您的项目

    一段堆栈溢出的代码 Stack Overflow has been the saviour of many programmers, including me. Some of us have nev ...

  4. python 捕获多个异常_Python捕获多个异常

    python 捕获多个异常 We can use a try-except block to catch exceptions and process them. Sometimes we call ...

  5. 10-FreeRTOS堆栈溢出

    1-堆栈溢使用情况和溢出检查 1.1堆栈的使用情况 如果使用xTaskCreate()创建任务,那么作为任务堆栈的内存将自动从FreeRTOS堆中分配,并通过传递给xTaskCreate() API函 ...

  6. 利用 watchpoint 监测堆栈溢出

    使用调试器捕获堆栈溢出 开始运行目标程序之前,首先在堆栈的底部设置 watchpoint ,倘若程序堆栈溢出,那么将触发该 watchpoint.假设堆栈起始地址为0x20030000,堆栈深度为0x ...

  7. spark filter 堆栈溢出

    spark sql filter 堆栈溢出 StackOverflowError 问题解决 spark sql 堆栈溢出 Caused by: java.lang.StackOverflowError ...

  8. 大数据——Java中异常的捕获和处理

    Java中异常的捕获和处理 异常的概述 认识异常 Java异常体系结构 Java异常处理机制 异常处理 使用try-catch处理异常 使用try-catch-finally处理异常 使用多重catc ...

  9. python抛出异常 后如何接住,Python 异常的捕获、异常的传递与主动抛出异常操作示例...

    本文实例讲述了Python 异常的捕获.异常的传递与主动抛出异常操作.分享给大家供大家参考,具体如下: 异常的捕获 demo.py(异常的捕获): try: # 提示用户输入一个整数 num = in ...

最新文章

  1. 朋友圈装死,微博蹦迪,Python教你如何掌握女神情绪变化 | CSDN博文精选
  2. 编程的50种基础算法_[校招基础算法]常见的ML、DL编程题
  3. springCloud Zuul 网关fallback
  4. 研究生调剂!!急!!!跪求解答!!?
  5. python 面向对象编程简称_Python基础-面向对象编程
  6. Launch Instruments
  7. Delphi-IOCP学习笔记九======性能测试和IOCP源码下载5000个连接数
  8. 常见面试算法:Logistic回归、树回归
  9. php 辗转相除法,手撸golang 基本数据结构与算法 最大公约数 欧几里得算法/辗转相除法...
  10. Windows下开源截屏工具软件Free Shooter
  11. Android 音频焦点(Audio Focus)
  12. hadoop shell 详解
  13. paip.日期时间操作以及时间戳uapi php java python 总结
  14. 图像识别用python还是matlab_用于图像识别的五大最佳编程语言!
  15. mnist手写数字识别与优化
  16. oracle -3233,ORA-3233 问题请教
  17. canvas压缩图片方法
  18. 现代密码学-密钥管理技术
  19. 考研要求过英语四六级!这些大学有明确规定!
  20. 20110814炒股日记--关于内外盘【600192长城电工】

热门文章

  1. 一、Python-劳务报酬计算器(新手练习)
  2. CSS盒子模型学习-02
  3. OpenCV基于dlib进行人脸关键点检测(摄像头)
  4. 获取指定日期所在月的最后一个工作日
  5. 银行利息计算(java)
  6. mysql连接耗尽_连接池耗尽了!!!
  7. 备案,备案!段总的Blog被叫停了!
  8. 程序员成长之路(一)
  9. 浙里办前端H5对接小结(复盘自用)
  10. PC安装安卓系统模拟器