1

ドキュメントをアップロードしようとする試みが Try/Catch ブロック内にラップされるメソッドをコーディングしています。

試行が失敗した場合は、再試行カウンターをインクリメントし、同じメソッドを再帰的に呼び出します。

「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
}

catch ブロックはnull、3 回すべて失敗した場合にのみ返されます。

編集:あなたは例外を黙って殺しています。よろしいですか?おそらく、ログに記録するか、発信者に通知することをお勧めします。

于 2012-07-24T14:29:55.770 に答える
0

2 つの変更が必要です。

  1. 関数の外で変数の再試行を宣言する
  2. UploadInvoice メソッドによって返された値を返します (catch ブロック内)。

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