【发布时间】:2019-06-04 02:37:00
【问题描述】:
我有一个使用支付服务类的 MVC 控制器。我应该在哪里进行异常处理?什么是最佳实践?
我是否在我的控制器和服务类中都使用 try/catch 块? 是否只是在服务类中再次抛出异常,以便可以在控制器中处理?还是应该在控制器中完成所有异常处理? 我可以捕获 Stripe 特定的异常,应该在服务类或控制器中完成吗?迷茫……
public async Task<IActionResult> DoSomething(MyViewModel model)
{
try
{
await _paymentService.UpdateSomethingAsync(id, token);
}
catch (Exception ex)
{
//handle
}
enter code here
}
public class PaymentService : IPaymentService
{
public async Task UpdateSomethingAsync(string id, string token)
{
try
{
//update using Stripe...
}
catch (Exception ex)
{
//TODO: Implement error handling
throw;
}
}
}
【问题讨论】:
-
这个问题太宽泛了,不能简单地回答。这里要考虑的因素太多了,不可能将它们全部放在一个简短的答案中。相反,请查看文档:docs.microsoft.com/dotnet/csharp/programming-guide/exceptions/…
-
通常情况下,uncauthexception(动作)过滤器用于记录异常。
-
好的,考虑到我有一个使用 Stripe 的支付服务。我是否应该在我的支付服务中捕获异常并再次抛出。或者我可以在控制器中捕获。即在支付服务中没有尝试/捕获,只是在控制器中?
-
我认为您的案例的策略取决于您想要完成的例外情况以及您希望如何返回响应客户端。如果您需要特别记录任何不一定会影响对用户的响应的内容,我认为您可以在服务本身内执行此操作,然后将其抛出以被外部捕获。然后在外部捕获添加/格式化您需要在那里记录的信息并向客户端返回适当的响应。请注意,封装在 try-catch 和日志记录中会影响性能,因此正如 @HimBromBeere 所说,对此没有简单的答案。
-
一般来说,如果你打算用它做某事,你只会捕获一个异常,并且你会在你打算采取行动的地方捕获它。牢记这两条简单的规则,您将很快找到捕获任何特定异常的正确位置。
标签: c# asp.net-mvc exception-handling