2012-07-24 19 views
1

我正在編寫一個嘗試上載文檔的方法被封裝在Try/Catch塊中的方法。來自Catch塊的Recusive調用

如果嘗試失敗,我遞增Retry計數器並遞歸調用相同的方法。

在'Catch'塊被擊中的情況下,我不清楚執行路徑。初始測試顯示在執行第一次遞歸調用之後執行'return null'語句。也許'返回null'語句需要在Catch塊內但在重試之外的循環中?

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

您的外部的可變的重試每次通話都會重置「重試」計數器,可能會提供額外的參數? – 2012-07-24 14:27:50

+0

變量重試是在方法內部聲明的('int retries = 0;')。試着改變這一點。 – shajivk 2012-07-24 14:28:11

+0

'retries'變量在方法中聲明。它不會> = 3. – ken2k 2012-07-24 14:28:23

回答

0

需要兩個更改:

  1. 聲明功能
  2. 返回由UploadInvoice方法返回的值(在catch塊)

    if (retries < 3) 
    { 
        Thread.Sleep(1000 * retries); 
        return UploadInvoice(filename); 
    } 
    
0

您需要將變量保留在方法之外。否則每次,它會重置爲0,你將永遠不會結束結束.....

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

    //do stuff 
} 

你的catch塊將返回null只有當它所有失敗3次。

編輯:您是SILENTLY KILLING的例外。你確定你想這麼做嗎?您可能需要將其記錄或通知返回給調用者。

+0

注意,這需要在下一次上傳之前手動重置計數器(否則它只會嘗試三次第一次上傳)。如果你關心這個方法,把方法放在方法之外會使線程安全。如果你想回來,你需要一些同步。 – cHao 2012-07-24 14:36:43