2011-01-28 81 views
8

我在BaseClass中有一個遞歸函數,它依賴於protected virtual函數返回它的條件。在遞歸函數中防止StackOverFlow

子類可能會錯誤地覆蓋此功能並導致StackOverFlow異常。最糟糕的是有一些網絡電話很慢,例外情況不會很快發生(很多資源浪費很長時間)。

我正在尋找一種方法來檢查StackOverFlow早期階段的某種方式在基類(可能使用Reflection和當前遞歸級別)。

有什麼想法?

+0

^vote for topic about stackoverflow。 – Robino 2014-12-24 13:10:23

回答

8

你可以通過一個簡單的整數「深度」的遞歸函數以及與每個後續調用加一。如果它大於最大允許深度,則拋出異常,然後等待,直到它太晚,並且發生了令人生畏的StackOverflow異常。

這樣的安全機制(增量計數器,檢查它不是愚蠢的大)也可以在while循環中得心應手,其中一個小錯誤可能導致消耗大量CPU的無限循環。

在有許多用戶(例如網站)的大型系統中,有時最好採用遞歸和while循環等預防措施,因爲後果可能遠遠超出一個網頁或系統的一個用戶。這不是很漂亮的代碼,純粹主義者無疑會對此置之不理,但它很有效率,它具有防禦性,而且很實用。

1

解決問題而不是創建解決方法。創建一個遞歸調用受保護虛函數的私有函數。

+0

沒辦法。返回條件直到運行時纔會顯示給基類,這是由子類通過重寫該方法提供的。 – Xaqron 2011-01-28 06:41:03

+0

?爲什麼你的基類要依賴於子類重載實現? – Pierreten 2011-01-28 06:45:37

0

儘管您可能可以閱讀調用堆棧並分析它,但我不會這麼做。

  1. 它會減慢執行
  2. 這不是你的基類的責任
  3. 文件的基礎類的行爲

另一種可能是做在調試模式下調用堆棧分析只要。這裏有一段代碼來看看如何獲​​得調用堆棧。

using System.Diagnostics; 

[STAThread] 
public static void Main() 
{ 
    StackTrace stackTrace = new StackTrace();   // get call stack 
    StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames) 

    // write call stack method names 
    foreach (StackFrame stackFrame in stackFrames) 
    { 
    Console.WriteLine(stackFrame.GetMethod().Name); // write method name 
    } 
} 

From this site