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异常

  • CLR在宿主环境中运行,宿主特别允许处理StackOverflow异常
  • stackoverflow异常由用户代码引发,而不是由于实际的堆栈溢出情况()
  • 问题

    您有一个堆栈溢出异常。使用所有堆栈内存时会发生这种情况。这通常发生在您有一个递归循环时。方法A调用方法B,方法B调用方法C,方法A调用方法B,方法C调用方法B,等等

    在这个循环的某个地方,堆栈溢出并导致此异常。例外的位置并不重要。在您的情况下,它是Random.Next(),但也可能发生在Console.WriteLine或其他任何地方

    StackOverflowException是一种特殊类型的异常,它不能总是被try-catch捕获

    简而言之:它与Random.Next()或try catch无关。只要试着找到并修复递归循环

    如何解决查找递归循环的问题

    • 在中断代码的某个地方设置断点
    • 运行应用程序,直到断点命中为止
    • 继续,直到断点再次命中。重复3到4次
    • 现在分析堆栈跟踪,找出递归循环的起始位置(哪些方法开始重复)并修复递归

      • 好的-有很多好的建议。下面是一个错误的分类:

        • 我调用了一个递归函数,不知何故导致代码崩溃
        • 我没有在递归调用中使用
          ChangeLocation()
          的返回值(谢谢@leppie)
        • \u recursiveCounter
          的值为+3000,这意味着它会自己重复
        • 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
        应该做一个检查,但是由于我没有看到代码,我无法确定它。很抱歉回答得太晚-正确,这解释了问题,但没有给我解决方案。然而,我确实认为我找到了它为什么会这样做的原因(见其他答案)。