出于需要而创建了应用程序异常,它包装了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)
投掷一个AppException
,Method1()
捕获块也永远不会被捕获。它总是捕获通用捕获块catch(Exception ex)
。
调试后,发现在catch(Exception ex)
catch块中,异常类型ex.GetType()
实际上是WriteConcernException
类型(MongoduplicateKeyException : WriteConcernException
)。
所以基本上没有击中的特定捕获块导致异常类型不是AppException
而是WriteConcernException
但是
不知道为什么会这样?我错过了一些明显的东西吗?请建议。
你在调试时找到了答案。 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)
...