特定于应用程序的异常包装“MongoDuplicateKeyException”未捕获

问题描述 投票:1回答:1

出于需要而创建了应用程序异常,它包装了MongoDuplicateKeyException并抛出了如下所示的异常

Public class AppException : Exception
{
  // all constructor implementation 

  public int ErrorCode { get; set; }
  public string AppMessage { get; set; }
}

在方法捕获和抛出异常

public async Task<Response> Method1(parameter ...)
{
  try
   {
      //some insert/update operation to DB 
      return <instance of Response>;
   }
  catch(MongoduplicateKeyException ex)
  {
    var exception = new AppException(ex.Message, ex)
    {
      ErrorCode = 22,
      AppMessage = "some message",
    };

    throw exception;
  }
}

上面调用Method1()的方法

try
{
  //some other operation
  var response = await Method1();
}
catch(AppException ex)
{
  SomeOtherLoggingMethod(ex, other parameter);
}
catch(Exception ex)
{
  SomeMethod(ex, other parameter);
}

令人惊讶的是,即使从catch(AppException ex)投掷一个AppExceptionMethod1()捕获块也永远不会被捕获。它总是捕获通用捕获块catch(Exception ex)

调试后,发现在catch(Exception ex) catch块中,异常类型ex.GetType()实际上是WriteConcernException类型(MongoduplicateKeyException : WriteConcernException)。

所以基本上没有击中的特定捕获块导致异常类型不是AppException而是WriteConcernException但是

不知道为什么会这样?我错过了一些明显的东西吗?请建议。

c# mongodb mongodb-.net-driver
1个回答
2
投票

你在调试时找到了答案。 catch(AppException ex)块未执行,因为public async Task<Response> Method1不会抛出AppException它会抛出WriteConcernException。

The API shows一个WriteConcernException是DuplicateKeyException的超类,因此没有命中Method1中的catch块,并且异常冒泡到调用者中的第二个catch块。

因此,如果您更新代码以捕获相应的异常,它应该按照您的意图工作。

public async Task<Response> Method1(parameter ...)
{
    try
    {
        //some insert/update operation to DB
        return <instance of Response>;
    }
    catch (MongoServerException mse)
    ...
© www.soinside.com 2019 - 2024. All rights reserved.