簡體   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