我知道 await 不能在 catch 子句中使用。但是我还没有真正遇到过与此相关的问题,直到现在......
基本上我有一个层负责接收传入的请求,处理它们,从它们构建消息并将消息传递给另一个负责发送消息的层。
如果在消息发送过程中出现问题,则会抛出自定义异常,并被消息发送层捕获。此时,该消息的失败记录应插入 DB(需要一些时间,因此异步),并将异常传播到负责向发出请求的客户端发送错误响应的上层.
下面是一些非常简化的代码,用于说明目的:
public async Task ProcessRequestAsync(Request req)
{
int statusCode = 0;
try
{
await SendMessageAsync(new Message(req));
}
catch(MyCustomException ex)
{
statusCode = ex.ErrorCode;
}
await SendReponseToClientAsync(req, statusCode);
}
public async Task SendMessageAsync(Message msg)
{
try
{
// Some async operations done here
}
catch (MyCustomException ex)
{
await InsertFailureForMessageInDbAsync(msg, ex.ErrorCode); // CAN'T DO THAT
throw;
}
}
当然,请求处理层对DB一无所知,它只是负责构建消息,将消息传递给消息处理层,并向客户端发送响应(肯定或否定)。
所以我认为这是有道理的......如果发生异常,我的“业务”层希望在数据库中插入失败记录并重新抛出异常,以便“请求”处理层可以做必要的事情(在这种情况下,发送一个对客户的否定响应)。
不应该以这种方式使用异常吗?这对我来说似乎很干净,但我不能在 catch 子句中执行此操作这一事实让我认为设计中可能存在代码异味(即使我想在一层中处理异常然后将其重新抛出)上层做一些不同的处理,在我看来,这正是例外的原因)。
有什么想法吗?
谢谢 !