0

可能重复:
如何防止和/或处理 StackOverflowException?(C#)
C# 捕获堆栈溢出异常

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

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

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

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

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

4

2 回答 2

0

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

于 2012-10-01T21:23:54.460 回答
0

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

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

于 2012-10-01T21:05:59.613 回答