ASP.NET MVC 4,抛出HttpException vs返回HttpStatusCodeResult?

我正在开发一个RESTful服务,我想返回400所有不支持的URL。

我的问题是我应该在何时select方法1而不是方法2,反之亦然。

//method 1 public ActionResult Index() { //The url is unsupported throw new HttpException(400, "Bad Request"); } 

这一个似乎更好?

 //method 2 public ActionResult Index() { //The url is unsupported return new HttpStatusCodeResult(HttpStatusCode.BadRequest, "Bad Request"); } 

第二个似乎更好,因为它不涉及exception抛出,与第一个例子相比,这是一个微小的成本。

在我看来,您需要首先考虑是否对不受支持的URL进行了请求。 那么你认为这是一个特殊的情况,或者你期望发生? 如果你认为这是一种特殊情况,那么创build并抛出exception(选项1)。 如果您预计您将收到不受支持的URL的许多请求,请将其视为您应用程序的function并使用方法2。

这就是说,如果您对不受支持的URL有太多请求,则需要再次考虑您的客户。 一般来说,我宁愿抛出一个exception,因为我不希望在不受支持的URL上收到太多的请求,如果发生这种情况,那么我想将它logging为例外,并调查原因。

作为一名DevOps团队,我们都处于思维定势之中,抛出更多的硬件来获得更好的结果总是一个好的原因。 所以我故意忽略了引发.NETexception的微小成本。

如果您正在利用像ApplicationInsights这样的遥测框架,那么只要返回状态代码就可以为您提供“失败的请求”。 它不会给你任何有用的信息,允许你编译或获取有关失败请求的“原因”的任何信息。

遥测平台期望并希望你抛出,因为错误遥测通常是围绕.NETexception,所以如果你不投掷,就会造成操作问题。

我实际上是在这里登陆的,因为我正在编写一个Roslyn分析器和CodeFix的过程,用于一个人们喜欢写的try{} catch { return BadRequest("put_the_reason_here"); } try{} catch { return BadRequest("put_the_reason_here"); }并且DevOps或Dev团队都没有在ApplicationInsights的系统遥测中看到任何有用的信息。

虽然这个问题有点老,但我想我会提出我的意见,因为我遇到了这个问题。

错误是价值。 这适用于HttpException (当unthrown)以及HttpStatusCodeResult。 但是,抛出exception会创build新的代码path,这些代码path远离同事,可能是一个比您的执行上下文更高的执行上下文,必须给出这些代码path将被传递给他们的文档,恕不另行通知。 然而,价值观告诉你,通过他们的types你需要知道的一切。 您可以在预期的执行path中使用它们的types来判断是否发生了错误,并查找与该错误相关的信息并logging下来。

我有时使用(轻度扩展)的Exception ,而不把它们扔到下一个执行上下文来提取David Rodriguez提到的有用的debugging信息。 从来没有任何借口将抛出的exception交给上面的执行上下文,而这些exception实际上并不例外,这只适用于实际上不在你的代码处理能力之外的事情( StackOverflowException ,其他致命的系统exception等)。

在一个networking应用程序中,比如你运行的任何MVC服务,抛出exception的性能损失都是毫无意义的。 可维护性的语义和效果不是。

networking错误是值,你应该像这样处理它们。