C# 来自Random.Next()的异常使try-catch块内的程序崩溃
所以,事情发生了: 在C# 来自Random.Next()的异常使try-catch块内的程序崩溃,c#,exception,error-handling,C#,Exception,Error Handling,所以,事情发生了: 在try-块中如何实现这一点? 为什么它不将其转发到catch-块 编辑: 有人指出,我可能有递归。我知道,我认为这不会造成问题 完整方法如下所示: private static GeoCoordinate ChangeLocation(GeoCoordinate location) { var tmp = location; var direction = new Random().Next(0, 359); var distance = new
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;
}
从2.0开始,只有在以下情况下才能捕获StackOverflow异常
- 在中断代码的某个地方设置断点李>
- 运行应用程序,直到断点命中为止李>
- 继续,直到断点再次命中。重复3到4次李>
- 现在分析堆栈跟踪,找出递归循环的起始位置(哪些方法开始重复)并修复递归
- 我调用了一个递归函数,不知何故导致代码崩溃
- 我没有在递归调用中使用
的返回值(谢谢@leppie)ChangeLocation()
的值为+3000,这意味着它会自己重复\u recursiveCounter
Random()。因为代码运行速度很快,所以始终会弹出相同的数字,从而导致
和方向
的值相同。添加种子值(使用距离
,as)可能是一种解决方案,也可能只是一个新的种子值睡眠
- 但是这可以做得更聪明一些,因为我有
\u recursiveCounter
- 好的-有很多好的建议。下面是一个错误的分类:
Random()
var direction = new Random(DateTime.Now.Millisecond + _recursiveCounter).Next(0, 359);
var distance = new Random(DateTime.Now.Millisecond + _recursiveCounter).Next(0, 5);
这只是因为您处于调试模式。如果您在未连接任何调试器的情况下实际运行exe(双击它),则捕获将按预期工作。请查看调试器中的调用堆栈,并查看溢出的内容。您可能在某个地方意外地递归调用了某个方法。很可能是ChangeLocation
造成的,而不是Random
您检查过ypur应用程序是否确实崩溃了吗?因为你的处理程序应该简单地捕获异常,然后你的应用程序继续。我相信这更重要的是,这是一个StackverflowExceptions,这意味着你不能立即捕获它。请看:我在原始帖子中添加了一个编辑。我确实有递归调用。虽然我不认为这是一个问题…它不一定是一个问题,只要它是非常清楚的循环应该退出。在您的示例中,我没有检测到明确的出口。也许InsidePolygon
应该做一个检查,但是由于我没有看到代码,我无法确定它。很抱歉回答得太晚-正确,这解释了问题,但没有给我解决方案。然而,我确实认为我找到了它为什么会这样做的原因(见其他答案)。