C# 避免跳槽的最好方法是什么?

C# 避免跳槽的最好方法是什么?,c#,goto,C#,Goto,我通常会陷入这样一种情况:后藤似乎是我心目中最好的选择。但是我已经读了好几遍没有使用它,而且总有一个替代方案。现在,我正在尝试这样的事情:- try{ //Something that requires internet connectivity; } catch{ //Show a message-Internet connectivity lost,and go back to try //-->FYI-

我通常会陷入这样一种情况:后藤似乎是我心目中最好的选择。但是我已经读了好几遍没有使用它,而且总有一个替代方案。现在,我正在尝试这样的事情:-

    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是函数中的第一个语句,如果我回忆起那个函数,我会堆积堆栈,所以这也不是一个更好的选择。我可以采取什么替代方案?

如果您想再试一次,请将您的try-catch包装在do-while循环中。

使用带有标志的
while
循环

var tryAgain = true;
while (tryAgain) 
{
    try
    {
        ...
        tryAgain = false;
    }
    catch (...)
    {
        tryAgain = ...
    }
}

在这种特殊情况下,递归调用同一个函数并保留一个带有调用次数的计数器没有什么错。类似这样的内容(在伪代码中):

public void域内部设置(int numberOfAttemptsRemaining)
{
尝试
{
//做事
}
捕获(连接异常)
{

如果(numberOfAttemptsRemaining)有可能为此创建函数吗?你是说try块中的所有内容吗?是的,代码非常简单,我可以为它创建函数,或者可能我不明白你的意思?“但我已经读了好几遍,不使用它”-你从哪里读到的?Edsger W.Dijkstra的引用是关于在特定语言中过度使用了
GOTO
。是的,你做对了,然后再次调用函数。但是检查下面的答案。他们可能会提供更好的解决方案alternative@Oded当前位置我在一本书中读到(亚什万特·卡内卡)因为它是我的第一本编程书,所以从它开始的所有东西都一直萦绕在我的脑海中(就像如果有人在童年时给你讲鬼故事,它们永远萦绕在我的脑海中)。我清楚地记得那句话——“避免使用goto,它们会让程序员的生活变得悲惨”:-D.但是它通常会使我的更简单。while中的内容是什么?比如在catch块中将varible设置为true,然后在while中进行测试?是的,这似乎是一个很好的选择。我想你的意思是--numberOfAttemptsRemaining,因为你的代码在足够的重试后会导致堆栈溢出,或者更好地使用numberOfAttemptsRemaining-1。对于reada但是,我会选择
numberOfAttemptsRemaining-1
,因为它很容易出错,而且您在没有实际需要的情况下更改了方法的输入参数。仍然+1是您的解决方案。@Steven
--numberOfAttemptsRemaining
适用于我的结构,它避免了在抛出时弹出然后递归back,因为
numberOfAttemptsRemaining
的本地副本没有更改。在任何情况下,我都对其进行了重新构造以使其更具可读性(尽管这意味着抛出一个新异常,而不仅仅是使用
throw
)@slugster:IMO,你的答案应该被标记为答案。@Steven OP没有提到任何关于最大尝试次数的内容。因此,我不同意“应该被标记为答案”因为它不能解决开箱即用的OPs问题。我一点也不反对这个解决方案,因为我可以看到它在哪里很方便。但是,它有点不灵活,因为它让用户无法控制他们是否要重试,它会自动发生。使用带有标志的while循环?说真的?!如果发生了严重错误,比如di怎么办远景为零。循环只是变成了一个无限循环,而整个解决方案都中断了!这使得问题很难诊断。我对此投了反对票。@UndefinedBehavious如果你捕获到一个特定的异常,你就不会捕获任何异常,因此如果出现了问题,异常就会冒出来-就像你预期的那样。W你认为这意味着什么?这个链接表明,在特定情况下,你可能会失去一些编译器优化,可能是毫秒。。。
public void DoMyInternetThing(int numberOfAttemptsRemaining)
{
    try 
    {
         //do stuff
    }
    catch (ConnectionException) 
    {
        if (numberOfAttemptsRemaining <= 0)
            throw new SomethingBadHappenedException();

        DoMyInternetThing(numberOfAttemptsRemaining - 1);  
    }
}