Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果搜索失败,我应该返回什么结果?_C#_.net_Architecture - Fatal编程技术网

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

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

我有一个简单的RESTFull服务,它可以获取和搜索一些post实体。我的项目有三个公共层(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);
}

您不应该在控制器中使用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属性以优雅的方式执行此操作,在控制器操作中这样做是完全正确的。