2012-08-14 66 views
3

我的mongoDB託管在Mongo Lab上,我使用C#作爲檢索數據的代碼。正確的方式MongoDB連接的C#異常處理

1 10次蒙戈查詢拋出異常:

System.Net.Sockets.SocketException: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 

我問MongoLab調查該時間段的日誌報告,他們說我沒有從他們身邊登錄並勸我使用正確的mongo異常處理。

我的問題:我應該如何處理C#中的Mongo異常?

我應該這樣做,如下所示。再次查詢一次或兩次:

/*Connection part 

    ---- 
    ---- 
    */ 
    List X<XYZ> = new List<XYZ>; 
    try{ 
    var Query = from o in collection.AsQueryable<XYZ>() 
          where ... 
          select o; 

    List= Query.ToList(); 
    } 
    catch(MongoException e){ 
var Query = from o in collection.AsQueryable<XYZ>() 
          where ... 
          select o; 
    List= Query.ToList(); 
    } 

感謝您的幫助。

回答

7

你不應該在catch子句中放置任何重要的程序邏輯部分。如果第二次拋出異常會怎麼樣?換句話說,catch條款中的所有內容應該足夠簡單,以保證不會失敗。

你可以做的是把你的整個塊進入一個循環,並設置一個重試計數器退出,如果失敗的次數預先確定(或可配置)號:

List<XYZ> list = null; 
const int maxRetries = 3; // could also be a configuration parameter 

int retries = maxRetries; 
while ((retries > 0) && (list == null)) { 
    try{ 
    var Query = from o in collection.AsQueryable<XYZ>() 
         where ... 
         select o; 

    list = Query.ToList(); 
    } 
    catch { 
    retries--; 

    if (retries < 1) { 
     throw; 
    } 
    } 
} 

這將嘗試查詢最多3次。如果查詢成功併成功轉換爲List,則循環退出。如果引發異常,則重試計數器遞減。如果達到最大重試次數,它將重新拋出異常。

+0

謝謝先生。這似乎是一個合理的方法。 +1並回答。 – user1071979 2012-08-15 10:33:46

+0

您不應該重試MongoConnectionException:_「重試引發MongoConnectionException的操作是不安全的__mongodb.github.io/mongo-csharp-driver/2.0/reference/driver/error_handling/。而是做一些像catch(MongoServerException)這樣的事情。 – 2015-12-06 14:10:34

+0

@Inge Eivind Henriksen文檔明確指出重試是不安全的_unless_操作是冪等的,我總是期望讀取是。 – Siewers 2016-06-28 19:39:30