C# 如果搜索失败,我应该返回什么结果?
我有一个简单的RESTFull服务,它可以获取和搜索一些post实体。我的项目有三个公共层(ORM、DAL、BLL)。我应该在控制器中使用try/catch表达式,还是需要在较低的层(如DAL或BLL)上使用?我想检查DAL层中操作的执行情况,然后检查控制器中的空值,以便返回错误的状态代码。有没有更优雅的方法 这是我的方法之一:C# 如果搜索失败,我应该返回什么结果?,c#,.net,architecture,C#,.net,Architecture,我有一个简单的RESTFull服务,它可以获取和搜索一些post实体。我的项目有三个公共层(ORM、DAL、BLL)。我应该在控制器中使用try/catch表达式,还是需要在较低的层(如DAL或BLL)上使用?我想检查DAL层中操作的执行情况,然后检查控制器中的空值,以便返回错误的状态代码。有没有更优雅的方法 这是我的方法之一: [HttpGet] public IHttpActionResult Details(int id) { BllTask task; try
[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);
}
您不应该在控制器中使用try-and-catch语句,控制器应该非常简单,也称为瘦控制器。如果控制器包含复杂的逻辑,然后需要一个try-and-catch语句来包装它,那么说明您做错了什么 有关详细信息,请参阅以下链接 try和catch表达式应该在ORM、DAL和BLL层中使用,这是因为如果有足够的上下文来理解异常,您希望尽早捕获异常 然后,如果可以,可以处理异常,如果需要,可以重新调用异常。在异常情况下,您可以忽略异常,而不是允许异常一直释放到控制器,从而允许您的软件提供可靠的服务 对于您决定不处理的异常,您应该将其记录下来,正如所提供代码中的注释所建议的那样,这样您就可以查看日志以查看是否存在重复出现的问题,并在需要时修复问题 请参阅上的以下内容 然后,表示层应该显示一条消息,说明没有找到搜索结果,因为它得到的响应是预期的响应,或者如果异常一直展开到表示层,则表示层应该显示一条错误消息 更新 正如您现在提供的代码示例一样,对于所提供的代码,最好删除try-catch语句,因为它没有意义。相反,如果其他层遵循链接中提到的约定,则以下内容将产生相同的结果:
[HttpGet]
public IHttpActionResult Details(int id)
{
BllTask task = taskService?.GetById(id);
return Json(task);
}
到目前为止,你得到了什么代码?@SimonPrice我刚刚更新了我的答案。我不会使用try-catch,只会返回
返回Json(任务)
然后以调用服务的任何形式处理返回值,但是如果具有给定id的用户不存在?您将得到空值。我认为您应该返回BadRequest
或NotFound
。如果您利用模型,而不是传递单个值,那么您可以使用ModelState.IsValid属性以优雅的方式执行此操作,在控制器操作中这样做是完全正确的。