[英]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.