Catch堆栈溢出异常C#

时间:2012-10-01 21:03:29

标签: c# .net exception .net-2.0 stack-overflow

  

可能重复:
  How do I prevent and/or handle a StackOverflowException? (C#)
  C# catch a stack overflow exception

我有一个用C#编写的相当复杂的应用程序(使用.NET 2.0)。程序以高度递归的方式处理大量文件,在某些客户端,它会遇到堆栈溢出异常。该计划非常复杂,我们甚至无法重现这个问题 - 即使在发生这种情况的客户也是如此。

显而易见的解决方案是修复导致堆栈溢出的代码,但这似乎不太可能 - 我们的代码库超过200万行代码,在内存中创建了一个大的递归数据结构。我们不太可能偶然发现问题部分。 (无论如何,不​​是在短期内。)

但是,我们的程序还会备份文件并对正在处理的文件进行更改,如果出现异常,它会将所有内容恢复到原始状态。当发生堆栈溢出异常时,该进程才会终止,并且此还原功能无法运行,因为无法捕获堆栈溢出。

所以我的问题是:有没有办法在.NET 2.0中捕获堆栈溢出异常。我不能托管CLR,异常是一个真正的堆栈溢出,不是我们的代码抛出的。能够做到这一点至少使我能够在程序终止之前恢复所做的更改。

编辑:请注意,我很清楚堆栈溢出异常是什么以及它有多严重。我找不到寻找建议 - 这种情况很少发生。我正在尝试做的是在发生时,在磁盘空间有限的环境中恢复客户端数据。如果我的程序在恢复操作后死亡,我就可以了。

2 个答案:

答案 0 :(得分:0)

这听起来像你在说,我有一个修改文件的过程,如果发生错误但它没有这样做,它应该恢复文件。

如果是相同的,为什么不使用临时文件,如果操作完成,则使用临时文件写入源文件。如果发生任何未捕获的异常,则您具有未触及的(写入)原始文件。

答案 1 :(得分:0)

我不建议这样做,但您可以使用/F Compiler Switch在编译磁贴上设置堆栈大小。默认值为1MB。 虽然这不是“修复”代码的好方法,但它可以防止那些讨厌的Stack Overflow消息。