c# - 搜索失败应该返回什么结果?

标签 c# .net architecture

我有一个简单的 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/

相关文章:

c# - 在 C# 中压缩数组函数

c# - 没有源代码的 ASP.NET 扩展应用程序

c# - 如何在 Azure 中从一个 csx 文件调用函数到另一个 csx 文件?

c# - IIS Request.UserHostAddress 返回 IPV6 (::1),即使 IPV6 已禁用

c# - 使用@Url.Action 生成 URL

c# - 取消订阅类事件?

c# - 使用 MS Access 作为 .NET 应用程序后端

.net - .NET 应用程序转向微服务——一些问题

java - 执行命令后客户端应用程序应采取什么操作?

java - Android 会阉割 ARM 的 Jazelle 技术吗?