簡體   English   中英

正確的方式Mongo DB連接的C#異常處理

[英]correct way C# exception handling for Mongo DB connections

我的mongoDB托管在Mongo Lab上,我使用C#作為檢索數據的代碼。

mongo查詢中有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異常?

我應該如下做。 在catch中再次查詢一次或兩次:

   /*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();
    }

感謝您提前幫助。

你永遠不應該把你的程序邏輯的任何實質部分放在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,則循環退出。 如果拋出異常,則重試計數器遞減。 如果達到最大重試次數,則會重新拋出異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM