我有一个使用支付服务类的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;
}
}
}
答案 0 :(得分:0)
我猜想异常处理必须在服务级别,因为它应该能够捕获和处理在服务级别发生的所有异常(也可以将其记录在服务级别以供以后分析),并将其以原始形式抛出(或根据需要可以在服务水平上对其进行定制)。
接收器(在这种情况下为控制器)应该具有自己的错误处理机制,因为它是应用程序的另一层,并且可能需要对异常进行某些操作或在UI级别进行日志记录。在这里,请注意,如果不需要操纵或记录异常或错误,则可以直接显示服务级别异常并从控制器中删除捕获。
希望有道理。
答案 1 :(得分:0)
只需在catch {}中编写与try {}中相同的代码,因为catch永远不会传回或返回值。
try
{
cust_id = txtID.Text;
submit changes();
lblmessage.Text = "Data Save";
}
catch (Exception ex)
{
lblmessage.Text = "Saving error";
cust_id = txtID.Text;
submit changes();
}