3

我的 mongoDB 托管在 Mongo Lab 上,我使用 C# 作为代码来检索数据。

10 次 mongo 查询中有 1 次抛出异常:

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

感谢您提前提供帮助。

4

1 回答 1

8

您永远不应该将程序逻辑的任何重要部分放在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,则循环退出。如果抛出异常,则重试计数器递减。如果达到最大重试次数,它将重新抛出异常。

于 2012-08-14T23:21:06.083 回答