我有一个简单的 RESTFull 服务,可以获取和搜索一些帖子实体。我的项目具有三个公共(public)层(ORM、DAL、BLL)。我应该在我的 Controller 中使用 try/catch 表达式还是我需要在较低层(例如 DAL 或 BLL)上使用它?我想检查我在 DAL 层中执行的操作,然后检查 Controller 中的空值以返回错误的状态代码。有没有更优雅的方法?
这是我的方法之一:
[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);
}
最佳答案
你不应该在 Controller 中使用 try 和 catch 语句, Controller 应该非常简单,也称为瘦 Controller 。如果 Controller 包含复杂的逻辑,然后需要 try 和 catch 语句来包装它,那么您就做错了。
请参阅以下链接以获取 why a thin controller is important .
try 和 catch 表达式应该在 ORM、DAL 和 BLL 层中使用,这是因为您想尽早捕获异常,如果有足够的上下文来理解异常。
然后,如果可以的话,要么处理异常,要么在需要时重新抛出,在异常情况下,您可以忽略异常,而不是让异常一直展开到 Controller ,从而让您的软件提供可靠的服务。
对于您决定不处理的异常,您应该记录它们,因为提供的代码中的注释表明您会这样做,允许您查看日志以查看是否存在重复出现的问题,并在需要时修复问题。
请参阅 when to catch early or late 上的以下内容.
然后表示层应该显示一条消息说没有找到搜索结果,因为它得到的响应是预期的响应,或者如果异常一直展开到表示层,表示层应该显示错误消息。
更新
既然你现在已经提供了一个代码示例,那么在提供的代码的情况下,你最好去掉 try catch 语句,这是没有意义的。相反,如果其他层遵循链接中提到的约定,则以下将产生相同的结果:
[HttpGet]
public IHttpActionResult Details(int id)
{
BllTask task = taskService?.GetById(id);
return Json(task);
}
关于c# - 搜索失败应该返回什么结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42024103/