在C#中捕获StackOverflow异常的一般方法是什么?

时间:2010-10-06 11:05:03

标签: c# exception-handling stack-overflow

如果我有一个我知道的方法可以无限地递归,但我无法可靠地预测会导致它的条件/参数,那么在C#中这样做的好方法是什么:

try
{
  PotentiallyInfiniteRecursiveMethod();
}
catch (StackOverflowException)
{
  // Handle gracefully.
}

显然在主线程中你不能这样做,但我已经被告知有几次可以使用线程或AppDomain来做,但我从未见过一个有效的例子。有谁知道这是如何可靠地完成的?

2 个答案:

答案 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();
  }
}