我有一块类似下面的代码:
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
? 或者,这是一个很好的解决方案?
这听起来像你真的想要一个循环。 我会写为:
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)
{
...
}
}
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();
}
}
这似乎更有意义,只是移动的try / catch到while循环。 然后,你可以处理错误和循环将继续正常,而无需使用标签和GOTO路由控制流程。
捕捉和恢复在每次迭代的状态,即使捉外将工作一样,在这里你仍然在循环,您可以决定是否继续或中断环路。
另:捕获的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.
}
}
对于那些在评论很聪明: 为什么不抓一般例外