[英]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.