我应该使用goto声明吗?

时间:2012-11-07 17:10:10

标签: c# goto

我有一段代码如下:

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 个答案:

答案 0 :(得分: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)
    {
        ...
    }
}

答案 1 :(得分: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();
  }
}

答案 2 :(得分:0)

将try / catch移动到while循环似乎更有意义。然后你可以只处理错误,循环将继续正常,而不必使用标签和gotos路由控制流。

答案 3 :(得分:-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.
    }
}

对于评论中非常聪明的人:Why don't catch general exception