Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环内的异常处理。为什么这段代码给出了一个“并非所有代码路径都返回值”错误?_C# - Fatal编程技术网

C# 循环内的异常处理。为什么这段代码给出了一个“并非所有代码路径都返回值”错误?

C# 循环内的异常处理。为什么这段代码给出了一个“并非所有代码路径都返回值”错误?,c#,C#,我的目标是.NET4.0并使用VS2012。代码只是一个示例。在while循环之后,您不会返回任何内容 不确定此方法用于什么,但我建议使用Int32.TryParse()代替此实现。在catch块内的if块中没有返回语句。因此,假定循环体将执行。这意味着while条件也会执行,因此编译器假定它可以返回false。这意味着语句后面还必须有一个返回,而语句编译器不能绝对判断一段代码是否最终会返回值。请看下面的例子,以了解难度 如果像这样重新构造代码,它的行为应该相同,但会修复错误: public s

我的目标是.NET4.0并使用VS2012。代码只是一个示例。

while
循环之后,您不会返回任何内容


不确定此方法用于什么,但我建议使用
Int32.TryParse()
代替此实现。

catch
块内的
if
块中没有返回语句。因此,假定循环体将执行。这意味着
while
条件也会执行,因此编译器假定它可以返回false。这意味着
语句后面还必须有一个返回,而
语句

编译器不能绝对判断一段代码是否最终会返回值。请看下面的例子,以了解难度

如果像这样重新构造代码,它的行为应该相同,但会修复错误:

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);
    }

在catch中,else条件返回,但如果不返回,则执行赋值。在你的时间之外也没有回报

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;
}
一般来说,我更喜欢编写如下重试逻辑

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

另外,再次查看代码后,您似乎正在编写
int.TryParse(字符串输入,out int输出)

编译器不够聪明,无法知道您最终将返回到循环中

我会在方法末尾添加这一行:

 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);
         }
     }
  }

该方法的使用与此无关,只是为了说明目的。
throw new InvalidOperationException("Should not have reached here.");