循环中的异常处理.为什么此代码给出并非所有代码路径都返回值错误

本文关键字:代码 路径 错误 返回值 异常处理 为什么 循环 | 更新日期: 2023-09-27 18:26:44

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块中没有返回语句。 因此,假定循环的主体执行。 这意味着while条件也会执行,因此编译器假定它可以返回 false。 这意味着在while声明之后还必须有退货

在你的 catch 中,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)