繁体   English   中英

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

[英]What's a good general way of catching a StackOverflow exception in C#?

如果我有一个我知道可能无限递归的方法,但我无法可靠地预测哪些条件/参数会导致它,那么在C#中执行此操作的好方法是什么:

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

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

你不能。 来自MSDN

从.NET Framework 2.0版开始,try-catch块无法捕获StackOverflowException对象,默认情况下会终止相应的进程。 因此,建议用户编写代码以检测并防止堆栈溢出。 例如,如果您的应用程序依赖于递归,请使用计数器或状态条件来终止递归循环。 请注意,承载公共语言运行时(CLR)的应用程序可以指定CLR卸载发生堆栈溢出异常的应用程序域,并让相应的进程继续。 有关更多信息,请参阅ICLRPolicyManager接口和主机概述。

无法捕获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();
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM