ASP.NET MVC 4, lancez HttpException vs retourne HttpStatusCodeResult?

Je développe un service RESTful et je souhaite retourner 400 pour toutes les URL non sockets en charge.

Ma question est de savoir quand choisir la méthode 1 plutôt que la méthode 2 et vice-versa.

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

Celui-ci semble être mieux?

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

La seconde semble meilleure car elle ne nécessite pas de lancer des exceptions à un micro-coût par rapport au premier exemple.

En tant que membre d’ une équipe DevOps , nous sums tous dans un état d’esprit où envoyer plus de matériel pour obtenir un résultat légèrement meilleur est toujours une bonne cause. Donc, j’ignore intentionnellement le micro-coût du déclenchement d’une exception .NET.

Si vous utilisez un framework de télémésortinge tel qu’ApplicationInsights, renvoyer simplement le code d’état ne vous donne rien de plus qu’une “requête échouée”. Cela ne vous donne aucune information utile qui vous permet de comstackr ou d’obtenir des informations sur le “pourquoi” de la requête ayant échoué.

Les plates-formes de télémésortinge prévoient et souhaitent que vous lanciez, car la télémésortinge d’erreur se déroule généralement autour des exceptions .NET, donc si vous ne lancez pas, vous créez un problème pour les opérations.

J’ai atterri ici parce que je suis en train d’écrire un parsingur Roslyn et CodeFix pour un projet où les gens aiment écrire try{} catch { return BadRequest("put_the_reason_here"); } try{} catch { return BadRequest("put_the_reason_here"); } et ni DevOps ni les équipes de développement ne voient rien d’utile dans la télémésortinge du système dans ApplicationInsights.

À mon avis, vous devez d’abord considérer si une demande est faite aux URL non sockets en charge. Pensez-vous que c’est une situation exceptionnelle ou vous vous attendez à ce que cela se produise? Si vous le considérez comme une situation exceptionnelle, créez et lancez une exception (option 1). Si vous vous attendez à recevoir de nombreuses demandes sur l’URL non prise en charge, traitez-la en fonction de votre application et utilisez la méthode 2.

Cela dit, vous devrez réfléchir à nouveau à vos clients si vous attendez trop de requêtes sur les URL non sockets en charge. En général, je préférerais lancer une exception, car je ne m’attends pas à recevoir trop de requêtes sur les URL non sockets en charge, et si cela se produit, j’aimerais le connecter en tant qu’exception et rechercher la raison.

Bien que cette question soit un peu ancienne, je pensais que je donnerais mon avis depuis que je suis tombé sur cela.

Les erreurs sont des valeurs. Cela vaut pour une HttpException (lorsqu’elle n’est pas exécutée) ainsi que pour un HttpStatusCodeResult . Toutefois, les exceptions déclenchées créent de nouveaux chemins de code cachés à vos collègues, qui peuvent représenter un contexte d’exécution plus élevé que le vôtre, et vous devez recevoir une documentation indiquant que ces chemins de code leur seront transmis sans préavis. Les valeurs, cependant, vous disent tout ce que vous devez savoir à travers leur type. Vous pouvez utiliser leur type dans le chemin d’exécution prévu pour déterminer si une erreur s’est produite ou pour rechercher des informations associées à cette erreur et la consigner.

J’utilise parfois des Exception (légèrement étendues) sans les placer dans le contexte d’exécution suivant pour extraire les informations de débogage utiles mentionnées par David Rodriguez. Il n’ya jamais d’excuse à remettre des exceptions au contexte d’exécution au-dessus de vous qui ne sont pas réellement exceptionnelles, et cela ne s’applique vraiment qu’à ce que votre code ne puisse pas gérer ( StackOverflowException , autres exceptions système fatales, etc.).

Dans une application en réseau, par exemple, quel que soit le service MVC que vous utilisez, la pénalité de performance liée à l’exception des exceptions n’a pas de sens. La sémantique et les effets sur la maintenabilité ne le sont pas.

Les erreurs de réseau sont des valeurs et vous devriez les gérer comme ça.