0

我通常会陷入这样一种情况,即 goto 似乎是我心目中的最佳选择。但是看了好几遍都没用,总有替代的。现在,我正在尝试这样的事情:-

    try{
            //Something that requires internet connectivity;
    }
     catch{
            //Show a message-Internet connectivity lost,and go back to try
    //-->FYI--Ignore "show message", because I am just appending this text to a  
    // textbox. So there won't be a problem of multiple ShowMessage Boxes.
      }

现在,在我看来,最好的选择是在 catch 语句中使用 goto,但我试图避免它。try 是函数中的第一个语句,如果我记得那个函数,我正在堆积堆栈,所以这也不是一个更好的选择。我可以采取什么替代方案?

4

3 回答 3

8

使用while带有标志的循环

var tryAgain = true;
while (tryAgain) 
{
    try
    {
        ...
        tryAgain = false;
    }
    catch (...)
    {
        tryAgain = ...
    }
}
于 2012-09-19T11:14:07.593 回答
4

在这种特殊情况下,递归调用相同的函数并保持一个计数器与您调用它的次数没有任何问题。像这样的东西(在伪代码中):

public void DoMyInternetThing(int numberOfAttemptsRemaining)
{
    try 
    {
         //do stuff
    }
    catch (ConnectionException) 
    {
        if (numberOfAttemptsRemaining <= 0)
            throw new SomethingBadHappenedException();

        DoMyInternetThing(numberOfAttemptsRemaining - 1);  
    }
}

与任何递归一样,您需要确保正确构建它,但这很好用(我自己使用过)并且它避免了您的goto(这本身并不坏,但使用它会导致意大利面条或结构不良的代码) .

于 2012-09-19T11:14:29.167 回答
2

If you want to try again, wrap your try-catch in a do-while loop.

于 2012-09-19T11:11:00.970 回答