繁体   English   中英

C# 我应该循环直到没有异常吗?

[英]C# Should I Loop until no exception?

我想通过一个循环 go 一次,但前提是通过循环抛出异常 go 。 我将如何在 C# 中写这个?

谢谢

这对我来说是糟糕的设计。 一般规则是:异常应用于流量控制。 有许多的原因; 也就是说,通常有更好/更可靠的方法可用于在抛出异常之前检查事物,并且它会降低效率。

尽管如此,为了争论,您可以执行以下操作:

while (true)
{
    try
    {
        // do stuff here
    }
    catch (MyException)
    {
        continue;
    }

    // all is good
    break;
}

再次 - 这不是推荐的方式。 如果您能提供更多上下文/示例/,我很乐意提出更好的建议

您可以在以下位置设置重试次数:

            int tryCount = 0;

            while (tryCount < 3)
            {
                try
                {
                    someReturn = SomeFunction(someParams);
                }
                catch (Exception)
                {
                    tryCount++; 
                    continue;
                }
                break; 
            }

这真的取决于你在做什么,以及抛出的异常类型。 许多异常并不是通过使用完全相同的输入/数据再次尝试来修复的,因此循环只会无限地不断生成异常。

相反,您应该检查相关异常,然后针对这些特定异常以适当的方式处理它们。

为什么不调用一个实际执行循环的函数,并在它之后有一个会再次调用该函数的捕获。

private void loop() {
  for(...) {
  }
}

其他一些方法:

try {
  loop();
} catch(Exception e) {
  loop();
}

似乎是一个坏主意,但无论如何尝试这样的事情:

删除

就像是:

bool done = false;
while( ! done )
{
  try
  {
    DoSomething();
    done = true;
  } catch(Exception ex)
  {
    HandleException(ex);
  }
}

正如诺多林所说,它闻起来像一个糟糕的设计。 您正在使用异常来控制程序的流程。 最好对会导致您重复操作的条件进行显式检查。

所以我正在使用这个简单的东西:D

bool exceptionthrow = false;

        while (!exceptionthrow)
        {
            try
            {
                value = Convert.ToInt32(Console.ReadLine()); //example
                exceptionthrow = true;
            }
            catch (Exception)
            {
                exceptionthrow = false;
                continue;
            }
        }

希望能帮助到你 :)

你可以使用波莉

然后您只需要使用您的异常和重试计数配置策略:

var retryPolicy = Policy
                .Handle<IOException>(x => x.Message.Contains("already exist"))
                .Or<FormatException>()
                .Retry(3);

你像这样使用:

retryPolicy.Execute(() =>
        {
            throw new FormatException();
        });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM