循环中的异常处理.为什么此代码给出并非所有代码路径都返回值错误
本文关键字:代码 路径 错误 返回值 异常处理 为什么 循环 | 更新日期: 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)