簡體   English   中英

循環內的異常處理。 為什么此代碼給出的不是所有代碼路徑都返回值錯誤?

[英]Exception handling within loop. Why does this code give a not all code paths return a value error?

public static Boolean CanParseStringToInt(String s)
    {
        Boolean retry = false;
        int n = 0;

        do
        {
            try
            {
                n = int.Parse(s);
                return true;
            }
            catch (Exception ex)
            {
                if (!retry)
                {
                    retry = true;
                }
                else
                {
                    return false;
                }
            }
        }
        while (retry);
    }

我的目標是.Net 4.0並使用VS2012。 該代碼僅是示例。

編譯器無法絕對確定一段代碼是否最終將返回一個值。 查看暫停問題 ,以了解難度示例。

如果您以這種方式重組代碼,則其行為應相同,但將修復錯誤:

public static Boolean CanParseStringToInt(String s)
{
    Boolean retry = false;
    int n = 0;

    do
    {
        try
        {
            n = int.Parse(s);
            return true;
        }
        catch
        {
            if (!retry)
            {
                retry = true;
            }
            else
            {
                break;
            }
        }
    }
    while (retry);

    return false;
}

編譯器不夠聰明,無法知道您最終將在循環內返回。

我將在方法末尾添加以下行:

throw new InvalidOperationException("Should not have reached here.");

while循環之后,您什么也不返回。

不知道此方法用於什么,但是我建議使用Int32.TryParse()代替此實現。

catch塊內的if塊中沒有return語句。 因此,假定循環體已執行。 這意味着while條件也會執行,因此編譯器認為它可以返回false。 這意味着在while語句之后還必須有一個返回值

在您的捕獲中,else條件返回,但if不返回,而是分配。 這段時間之外也沒有任何回報。

       catch (Exception ex)
        {
            if (!retry)
            {
                retry = true;
            }
            else
            {
                return false;
            }
        }

通常,我喜歡編寫如下的重試邏輯;

 for (int i = 0; i < retries; i++)
 {
     try
     {
         //do stuff that could throw
     }
     catch (Exception e)
     {
         Thread.Sleep(500);
         if (i == retries - 1)
         {
             throw new Exception(e.Message);
         }
     }
  }

另外,再次查看代碼后,似乎您正在寫int.TryParse(string input, out int output)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM