ASP.NET Core MVC中的异常和StatusCode

时间:2017-03-15 14:03:46

标签: asp.net-core asp.net-core-mvc .net-core

我们有UseExceptionHandler(处理Exeptions)和UseStatusCodePages(处理StatusCode)。为什么在ASP.NET Core MVC中我们使用StatusCodeResult而不仅仅是方便地扩展Exception

1 个答案:

答案 0 :(得分:2)

UseExceptionHandler通常用于捕捉意外错误并以更友好的方式预设给用户。

而REST API中的状态代码更为重要,可以向客户端发出特定操作的成功或失败(以及失败的具体原因)。

控制器操作永远不应抛出异常并访问不存在的特定资源(即数据库记录),您应返回404(未找到)。当传递数据无效时,休息apis返回" 400错误请求",成功200.当创建新资源201时(使用"位置"标题包含新资源的URL,请参阅控制器类的CreatedAtAction方法。)

对于视图,在将错误直接呈现到HTML代码中的情况下,它的工作方式不同。您还可以使用MVC-esque视图控制器返回状态代码,并使用UseStatusCodePages处理它(即显示不存在的资源的通用NotFound.cshtml模板)。

此外,您的问题听起来像是要使用例外来设置状态代码,出于几个原因这是错误的。

  1. 例外应该(顾名思义)例外;阅读:当意外发生时。例如,如果您尝试从您的银行帐户中提取负余额并进一步处理,则没有任何意义或变得不可能。

    如果您预计会出现错误,则应返回结果或以不同方式处理。对于验证,您应该使用Result类(即来自ASP.NET Core Identity的IdentityResult,其中包含Success属性和一个属性,该属性包含操作或验证失败时的错误消息列表。

  2. 投掷和捕获异常是非常昂贵的,所以它们实际上只有在(如上所述)发生意外情况时才会被抛出。没有找到记录并不意外。
  3. (Ab)使用流控制的异常(决定执行哪个代码路径)是错误的。那就是if/switch和战略模式之类的模式。例外只会使代码难以理解且难以维护。