我有一段代码如下:
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
相比,是否有更好的替代方案?或者这是一个很好的解决方案吗?
答案 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
是错误的(如果抓到StackOverflowException
或MemoryLeachException
,你会怎么做 - 编辑:这只是例如,检查文档以了解实际可以捕获的内容)。捕获您希望抛出的具体类型的异常。
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