我在BaseClass
中有一個遞歸函數,它依賴於protected virtual
函數返回它的條件。在遞歸函數中防止StackOverFlow
子類可能會錯誤地覆蓋此功能並導致StackOverFlow
異常。最糟糕的是有一些網絡電話很慢,例外情況不會很快發生(很多資源浪費很長時間)。
我正在尋找一種方法來檢查StackOverFlow
早期階段的某種方式在基類(可能使用Reflection
和當前遞歸級別)。
有什麼想法?
我在BaseClass
中有一個遞歸函數,它依賴於protected virtual
函數返回它的條件。在遞歸函數中防止StackOverFlow
子類可能會錯誤地覆蓋此功能並導致StackOverFlow
異常。最糟糕的是有一些網絡電話很慢,例外情況不會很快發生(很多資源浪費很長時間)。
我正在尋找一種方法來檢查StackOverFlow
早期階段的某種方式在基類(可能使用Reflection
和當前遞歸級別)。
有什麼想法?
你可以通過一個簡單的整數「深度」的遞歸函數以及與每個後續調用加一。如果它大於最大允許深度,則拋出異常,然後等待,直到它太晚,並且發生了令人生畏的StackOverflow
異常。
這樣的安全機制(增量計數器,檢查它不是愚蠢的大)也可以在while
循環中得心應手,其中一個小錯誤可能導致消耗大量CPU的無限循環。
在有許多用戶(例如網站)的大型系統中,有時最好採用遞歸和while循環等預防措施,因爲後果可能遠遠超出一個網頁或系統的一個用戶。這不是很漂亮的代碼,純粹主義者無疑會對此置之不理,但它很有效率,它具有防禦性,而且很實用。
儘管您可能可以閱讀調用堆棧並分析它,但我不會這麼做。
另一種可能是做在調試模式下調用堆棧分析只要。這裏有一段代碼來看看如何獲得調用堆棧。
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
}
}
^vote for topic about stackoverflow。 – Robino 2014-12-24 13:10:23