2016-01-15 89 views
1

左右的時間內,發生這種情況:異常崩潰程序的try-catch塊

enter image description here

這怎麼可能一個try - 塊內? 它怎麼沒有轉發到catch - 塊?

編輯:

已經指出的,我可能有遞歸。我這樣做,我認爲這不會導致問題。

完整的方法是這樣的:

private static GeoCoordinate ChangeLocation(GeoCoordinate location) 
{ 
    var tmp = location; 
    var direction = new Random().Next(0, 359); 
    var distance = new Random().Next(0, 5); 

    //Calculate movement 
    var vertical = Math.Sin(direction) * distance; //Sinus relation shortened 
    var lastAngle = 180 - 90 - (direction % 90); 
    var horisontal = Math.Sin(lastAngle) * distance; //Sinus relation shortened 

    //Add movement to location 
    tmp.Latitude = location.Latitude + (vertical/10000); 
    tmp.Longitude = location.Longitude + (horisontal/10000); 

    //If new location is outside a specific area 
    if (!InsidePolygon(_siteCoordinates, tmp)) 
    { 
     _recursiveCounter++; 
     //Ninja edit: @Leppie pointed out I was missing 'tmp =': 
     tmp = ChangeLocation(location); //Recursive move to calculate a new location 
    } 

    //Print the amount of recursive moves 
    if (_recursiveCounter != 0) 
     Console.WriteLine($"Counter: {_recursiveCounter}"); 
    _recursiveCounter = 0; 

    return tmp; 
} 
+1

這只是因爲您處於調試模式。如果你實際上沒有附加任何調試器就運行exe(雙擊它),那麼捕獲將按預期工作。 –

+0

在調試器中查看您的調用堆棧,看看有什麼溢出。你可能在某處偶然調用一個方法遞歸。 – Baldrick

+0

可能'ChangeLocation'是罪魁禍首,而不是'隨機' – Ian

回答

0

好的 - 這裏有很多好的建議。這裏有一個向下突破什麼其實是錯誤的:

  • 我稱爲遞歸函數,它莫名其妙使得代碼崩潰。
  • 我在遞歸調用中沒有使用ChangeLocation()的返回值(謝謝@leppie)。
  • 的值爲+3000,這意味着這只是不斷重複自我。
  • Random()可以有一個種子來產生一個新的起始值。由於代碼運行速度如此之快,所以始終彈出相同的數字,導致directiondistance的值相同。添加種子值(使用Sleep,作爲Microsoft points out)可能是一個解決方案,或者只是一個新的種子值。
  • 但是這可以做得更聰明,因爲我有。

根本原因是Random().Next(...)被調用次數過多會導致其他異常拋出異常。

var direction = new Random(DateTime.Now.Millisecond + _recursiveCounter).Next(0, 359); 
var distance = new Random(DateTime.Now.Millisecond + _recursiveCounter).Next(0, 5); 
2

與2.0開始出現StackOverflow異常只能在下列情況下被捕獲。

  1. CLR是在宿主環境中,其中主機特別允許的StackOverflow例外處理
  2. 該計算器異常是由用戶代碼拋出,而不是由於實際的堆棧溢出情況中運行(Reference

https://stackoverflow.com/a/1599238/4136669

MSDM

+0

對不起,最近的答案 - 正確的,這解釋了這個問題,但並沒有給我一個解決方案。不過,我確實認爲我發現它爲什麼這樣做(請參閱其他答案)。 –

1

問題

你有一個堆棧溢出的異常。這發生在使用全部堆棧內存時。這主要發生在你有遞歸循環的時候。因此方法A調用方法B調用方法C調用方法A調用方法B調用方法C等等等等。

在此循環的某處,堆棧溢出並導致此異常。例外的地方並不重要。在你的情況下,它是Random.Next(),但它也可能發生在Console.WriteLine或其他任何地方。

StackOverflowException是一種特殊類型的異常,不能總是通過try-catch來確定。

簡而言之:它與Random.Next()或try-catch沒有關係。試着找到並修復遞歸循環。

如何解決找到一個遞歸循環

  • 在你的斷碼的地方設置一個斷點。
  • 運行你的應用程序直到斷點命中。
  • 繼續直到breakpoinnt再次點擊。重複這個3或4次。
  • 現在分析你的堆棧跟蹤,並找出你的遞歸循環開始的位置(哪些方法是重複的)並修復遞歸。
+0

我在原帖中添加了一個編輯。我確實有遞歸調用。雖然我不認爲它是一個問題... –

+0

它不一定是一個問題,只要它非常清楚當循環應該退出。在你的例子中,我沒有發現一個明確的退出。也許'InsidePolygon'應該做一個檢查,但由於我沒有看到代碼,我不能確定它。 –

相關問題