我有一个简单的RESTFull服务,可以获取并搜索一些帖子实体。我的项目有三个常见层(ORM,DAL,BLL)。我应该在控制器中使用try / catch表达式,还是需要在较低层(如DAL或BLL)上执行此操作?我想在DAL层检查我的操作的执行,然后检查控制器中的空值,以便返回错误的状态代码。有更优雅的方式吗?
这是我的方法之一:
[HttpGet]
public IHttpActionResult Details(int id)
{
BllTask task;
try
{
task = taskService?.GetById(id);
}
catch(Exception exc)
{
// change type of exception
// handle it
// log it
return InternalServerError();
}
return Json(task);
}
答案 0 :(得分:3)
你永远不应该在控制器中使用try和catch语句,控制器应该非常简单,也称为瘦控制器。如果控制器包含复杂的逻辑,然后需要try和catch语句来包装它,那么你做错了。
请参阅why a thin controller is important的以下链接。
try和catch表达式应该在ORM,DAL和BLL层中使用,这是因为你想要尽早捕获异常,如果有足够的上下文来理解异常。< / p>
然后,如果可以,或者在需要时重新处理异常,在特殊情况下你可以忽略异常,而不是允许异常一直放到控制器,允许你的软件提供可靠的服务。
对于您决定不处理的异常,您应该记录它们,作为提供的代码中的注释,允许您查看日志以查看是否存在重复出现的问题,并在需要时修复问题。
请参阅when to catch early or late上的以下内容。
然后,表示层应该显示一条消息,说明没有找到搜索结果,因为它得到的响应是预期的响应,或者如果异常一直展开到表示层,表示层应该显示错误消息。
<强>更新强>
正如您现在提供的代码示例,在提供代码的情况下,您最好删除try catch语句,这是没有意义的。相反,如果其他层遵循链接中提到的约定,则以下内容将具有相同的结果:
[HttpGet]
public IHttpActionResult Details(int id)
{
BllTask task = taskService?.GetById(id);
return Json(task);
}