簡體   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