5

我有一段代码如下:

try
{
Work:

   while(true)
   {
      // Do some work repeatedly...
   }
}
catch(Exception)
{
   // Exception caught and now I can not continue 
   // to do my work properly

   // I have to reset the status before to continue to do my work
   ResetStatus();

   // Now I can return to do my work
   goto Work; 
}

与使用相比有更好的选择goto吗?或者这是一个很好的解决方案?

4

4 回答 4

16

听起来你真的想要一个循环。我会把它写成:

bool successful = false;
while (!successful)
{
    try
    {
        while(true)
        {
            // I hope you have a break in here somewhere...
        }
        successful = true;
    }
    catch (...) 
    {
        ...
    }
}

您可能想改用do/while循环;我倾向于更喜欢直while循环,但这是个人喜好,我可以看到它在这里可能更合适。

不过我不会goto。它往往使代码更难遵循。

当然如果你真的想要一个无限循环,只要把循环放在try/catch里面:

while (true)
{
    try
    {
        ...
    }
    catch (Exception)
    {
        ...
    }
}
于 2012-11-07T17:13:28.120 回答
10

Goto很少使用合适的构造。使用会使 99% 的查看您的代码的人感到困惑,甚至在技术上正确使用它也会显着减慢对代码的理解。

在大多数情况下,代码重构将消除对goto. 即在您的特定情况下,您可以简单地try/catch在里面移动while(true)。将迭代的内部代码制作成单独的函数可能会使其更加清晰。

while(true)
{
  try
  {
      // Do some work repeatedly...
  }
  catch(Exception)
  {
   // Exception caught and now I can not continue 
   // to do my work properly

   // I have to reset the status before to continue to do my work
   ResetStatus();
  }
}
于 2012-11-07T17:12:53.167 回答
0

将 try/catch 移到 while 循环中似乎更有意义。然后您可以处理错误,循环将正常继续,而无需使用标签和 goto 路由控制流。

于 2012-11-07T17:15:29.340 回答
-2

在每次迭代中捕获并恢复状态,即使在外部捕获也会起作用,但您仍然处于循环中,您可以决定是继续还是中断循环。

另外:从一开始就捕获一个Exception错误(如果您捕获StackOverflowExceptionMemoryLeachException-编辑:这只是例如,检查文档以了解您在现实中可以捕获什么)。捕获您希望抛出的具体类型的异常。

while(true)
{
    try
    {
        // Do some work repeatedly...
    }
    catch(FileNotFoundException) //or anything else which you REALLY expect.
    {
        // I have to reset the status before to continue to do my work
        ResetStatus();
        //decide here if this is till OK to continue loop. Otherwise break.
    }
}

对于那些在评论中非常聪明的人:为什么不捕获一般异常

于 2012-11-07T17:16:16.253 回答