当前位置: 首页 > 知识库问答 >
问题:

我应该返回一个状态码还是抛出一个异常?Net Web Api 2

习高格
2023-03-14

我见过这样的例子

public IHttpActionResult GetProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
    return Ok(item);
}

但我也认为这是一种选择

public IHttpActionResult GetProduct(int id)
{
    Product item = repository.Get(id);
    if (item == null)
    {
        return NotFound();
    }
    return Ok(item);
}

抛出异常或简单返回NotFound (IHttpActionResult实例)有什么好处吗?

我知道响应/请求管道中的某些阶段可以处理这些结果中的任何一个,就像第一个示例一样

public class NotFoundExceptionFilterAttribute : ExceptionFilterAttribute 
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is NotFoundException)
        {
            // Do some custom stuff here ...
            context.Response = new HttpResponseMessage(HttpStatusCode.NotFound);
        }
    }
}

...

GlobalConfiguration.Configuration.Filters.Add(
    new ProductStore.NotFoundExceptionFilterAttribute());

共有2个答案

林修雅
2023-03-14

抛出异常始终应视为例外情况。虽然很罕见,但仍有可能发生,应妥善处理。

这取决于您需要从数据库中检索不存在的项目的频率。请记住,异常抛出通常是性能杀手。

你也应该看看这个:

何时抛出异常?

贺景胜
2023-03-14

iHttpPactionResult是WebApi 2中添加的一项功能。WebApi 1中的传统方法,即创建HttpResponseMessage,或抛出HttpResponseException,仍然可用,但开发ihtpPactionresult是为了简化流程。

IHttpActionResult接口有一个方法:

public interface IHttpActionResult
{
    Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
}

NotFound方法简单地创建一个NotFoundResult,它返回一个带有HttpStatusCode.NotFound的空响应。这本质上与抛出<code>HttpResponseException(HttpStatusCode.NotFound)

IHttpActionResult接口还允许您轻松创建自定义ActionResult类以返回任何HttpStatusCode或您希望的任何内容类型。

 类似资料:
  • 问题内容: 这是另一个有争议的主题,但是这次我只在寻找简单且记录在案的答案。场景: 让我们假设以下方法: 问题: 1.您如何建议改进这种归还某些属性的狗的技术? 2. rs.next()对于空的ResultSet将返回false,或者将生成异常,例如: 字符串str = null; System.out.println(str.toString()); 3.如果在从ResultSet的当前行初始化

  • 问题内容: 从请求返回之前,我有一些异步方法需要等待完成。我正在使用Promises,但我不断收到错误消息: 为什么这令人高兴?这是我的代码: 问题答案: 只要避免构造函数反模式-promise-construction-antipattern-and-how-to-avoid- it)!如果您不调用而是返回一个值,那么您将需要进行一些操作。该方法应该用于链接:

  • 问题内容: 我发现自己同意返回接口而不是具体的类。 原因很简单,我要松散耦合。 但是还会有其他影响或权衡吗? 问题答案: 对于List或ArrayList之类的类型,不应进行任何编译,并且应将List提升Code返回到接口。 如果这是通过诸如CopyOnWriteArrayList之类的并发包进行的,并且您使用的是addIfAbsent之类的方法(未在List接口中定义),您将发现自己受到限制。

  • 我发现自己同意返回一个接口,而不是一个具体的类。

  • 假设我有一个方法将只读视图返回到成员列表中: 进一步假设客户机所做的只是立即对列表进行一次迭代。也许是为了把玩家放进一个JList或者别的什么。客户端没有存储对列表的引用以供以后检查! 对于这种常见的场景,我是否应该返回一个流呢? 还是返回流在Java中不是惯用的?流被设计成总是在创建它们的同一个表达式中“终止”吗?

  • 我让我的程序工作并全部完成(java)。这是一个简短而简单的工作面试程序。我通过抛出自定义异常来处理诸如不正确的输入格式之类的事情。这是最好的方法还是我应该只做一个打印声明?