如果我有一个我知道的方法可以无限地递归,但我无法可靠地预测会导致它的条件/参数,那么在C#中这样做的好方法是什么:
try
{
PotentiallyInfiniteRecursiveMethod();
}
catch (StackOverflowException)
{
// Handle gracefully.
}
显然在主线程中你不能这样做,但我已经被告知有几次可以使用线程或AppDomain来做,但我从未见过一个有效的例子。有谁知道这是如何可靠地完成的?
答案 0 :(得分:11)
你做不到。来自MSDN
从.NET Framework开始 版本2.0,StackOverflowException try-catch无法捕获对象 块和相应的过程是 默认终止。所以, 建议用户编写代码 检测和防止堆栈 溢出。例如,如果你的 应用程序取决于递归,使用 反击或国家条件 终止递归循环。注意 托管的应用程序 公共语言运行库(CLR)可以 指定CLR卸载 应用程序域所在的堆栈 溢出异常发生并让 相应的过程继续。对于 更多信息,请参阅 ICLRPolicyManager接口和 托管概述。
答案 1 :(得分:1)
无法捕获StackOverflowException,但您可以使用未处理的异常执行某些操作:
static void Main()
{
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
}
static void CurrentDomain_UnhandledException
(object sender, UnhandledExceptionEventArgs e)
{
try
{
Exception ex = (Exception)e.ExceptionObject;
MessageBox.Show("Whoops! Please contact the developers with the following"
+ " information:\n\n" + ex.Message + ex.StackTrace,
"Fatal Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
finally
{
Application.Exit();
}
}