我应该使用goto语句? [关闭](Should I use goto statement? [

2019-07-03 15:14发布

我有一块类似下面的代码:

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 ? 或者,这是一个很好的解决方案?

Answer 1:

这听起来像你真的想要一个循环。 我会写为:

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)
    {
        ...
    }
}


Answer 2:

Goto是很少适当的结构来使用。 用法会混淆的人谁看你的代码,甚至在技术上正确使用99%的会理解代码显著放缓。

在大多数情况下,代码重构的将消除需要(或希望使用)的goto 。 即你的具体情况,你可以简单地捷运try/catchwhile(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();
  }
}


Answer 3:

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



Answer 4:

捕捉和恢复在每次迭代的状态,即使捉外将工作一样,在这里你仍然在循环,您可以决定是否继续或中断环路。

另:捕获的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.
    }
}

对于那些在评论很聪明: 为什么不抓一般例外



文章来源: Should I use goto statement? [closed]
标签: c# goto