1

我正在编写一种方法,将上传文档的尝试包装在 Try/Catch 块中。

如果尝试失败,我将增加 Retry 计数器并递归调用相同的方法。

在“Catch”块被命中的情况下,我不清楚执行路径。初始测试表明,在执行第一个递归调用之后执行了“return null”语句。也许'return null'语句需要在 Catch 块内但在 retries<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;
        }
4

2 回答 2

0

您需要将变量保留在方法之外。否则每次,它都会重置为 0,你将永远不会结束......

int retries = 0;
public RssUploadDocOutput UploadInvoice(string filename)
{
  //no need of int retries = 0; inside the method 

  //do stuff
}

null只有当它全部失败 3 次时,你的 catch 块才会返回。

编辑:您正在默默地杀死异常。你确定要这样做吗?您可能希望将其记录或通知回呼叫者。

于 2012-07-24T14:29:55.770 回答
0

需要两处改动:

  1. 在函数外声明变量重试
  2. 返回 UploadInvoice 方法返回的值(在 catch 块中)

    if (retries < 3)
    {
        Thread.Sleep(1000 * retries);
        return UploadInvoice(filename);
    }
    
于 2012-07-24T14:34:51.167 回答