Django - gestion des exceptions, meilleure pratique et envoi d'un message d'erreur personnalisé

Je commence à réfléchir à des la gestion des exceptions dans mon Django app, et mon objectif est de le rendre aussi convivial que possible. Par la convivialité, je suppose que l'utilisateur doit toujours obtenir une clarification détaillée sur ce qui s'est mal passé.
La suite sur ce post, la meilleure pratique consiste à

l'utilisation d'une réponse JSON avec le statut de 200 pour vos réactions normales et
de retour d'un (!) 4xx/5xx réponse pour les erreurs. Celles-ci peuvent apporter
La charge utile JSON, trop, de sorte que votre côté serveur peut ajouter des détails supplémentaires
à propos de l'erreur.

J'ai essayé de google, les mots clés de cette réponse, par toujours plus de questions que de réponses dans ma tête.

  1. Comment puis-je décider sur quel code d'erreur - 400 ou 500 - retour? Je veux dire, Django a de nombreux prédéfinis types d'erreur, et comment puis-je mettre en œuvre cette correspondance entre Django types d'exceptions et de 400-500 code d'erreur de faire l'exception de la manipulation de blocs SEC et réutilisables que possible?
  2. Pouvez l'approche avec le middleware suggéré par @Reorx dans le post être considérée comme viable ? ( La réponse a obtenu seulement un upvote, donc me faire hésiter à se plonger dans les détails et de les mettre en œuvre dans mon projet
  3. Plus important encore, parfois, je pourrait soulever une erreur liée à la logique métier, plutôt que de syntaxe incorrecte ou quelque chose de standard comme valeur null. Par exemple, si il n'y a pas de PDG dans mon entité juridique, que je veuille interdire à l'utilisateur de l'ajout d'un contrat. Quel devrait être le statut de l'erreur dans ce cas, et comment dois-je jeter une erreur avec mon explication détaillée de l'erreur pour l'utilisateur?

Penchons-nous sur un simple point de vue

def test_view (request):

   try:
          # Some code .... 
          if my_business_logic_is_violated():
              # How do I raise the error
              error_msg = "You violated bussiness logic because..."
              # How do I pass error_msg 
          my_response = {'my_field' : value}
  except ExpectedError as e:
          # what is the most appropriate way to pass both error status and custom message
          # How do I list all possible error types here (instead of ExpectedError to make the exception handling block as DRY and reusable as possible
      return JsonResponse({'status':'false','message':message}, status=500)

source d'informationauteur Edgar Navasardyan