如果搜索失败,我应该返回什么结果?

时间:2017-02-03 12:15:26

标签: c# .net architecture

我有一个简单的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);
}

1 个答案:

答案 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);
}