我正在编写一种方法,其中上传文档的尝试包含在Try / Catch块中。
如果尝试失败,我正在递增重试计数器并递归调用相同的方法。
在那些遇到'Catch'块的情况下,我不清楚执行路径。初始测试表明,在第一次递归调用执行后执行'return null'语句。也许'return null'语句需要在Catch块内但在重试之外< 3循环?
public RssUploadDocOutput UploadInvoice(string filename, int retries)
{
var returnsOutput = new RssUploadDocOutput();
GoogleSheetsCommand sscmd = new GoogleSheetsCommand("UploadDocument", ConnSheets);
sscmd.CommandType = System.Data.CommandType.StoredProcedure;
sscmd.Parameters.Add(new GoogleSheetsParameter("LocalFile", filename));
//int retries = 0; removed
try
{
GoogleSheetsDataReader rdr = sscmd.ExecuteReader();
rdr.Read();
returnsOutput.ID = rdr[0].ToString();
[...]
returnsOutput.Weblink = rdr[6].ToString();
return returnsOutput;
}
catch (Exception ex)
{
//retries++;
Logger.Instance.LogException(ex);
if (retries < 3)
{
Thread.Sleep(1000 * retries);
UploadInvoice(filename, retries+1);
}
}
return null;
}
答案 0 :(得分:0)
您需要将变量保留在方法之外。否则每次都会重置为0,最终会永远不会结束.....
int retries = 0;
public RssUploadDocOutput UploadInvoice(string filename)
{
//no need of int retries = 0; inside the method
//do stuff
}
只有当它失败了3次时,你的catch块才会返回null
。
编辑:您无声杀人例外。你确定要这么做吗?您可能希望将其记录或通知回调用者。
答案 1 :(得分:0)
需要两处改变:
返回UploadInvoice方法返回的值(在catch块中)
if (retries < 3)
{
Thread.Sleep(1000 * retries);
return UploadInvoice(filename);
}