2015-02-17 2 views
1

Я имею следующий вид (с использованием рамки Django REST):Как обрабатывать исключения в представлениях Django?

class MyDataView(APIView): 

    def post(self, request, format=None): 
     my_data = MyData() 
     try: 
      result = my_data.save(request.data) 
     except: 
      exception_type, exception_value = sys.exc_info()[0:2] 
      error = exception_type.__name__ + ': ' + str(exception_value) 
      return Response(str(error), status=status.HTTP_400_BAD_REQUEST) 
     else: 
      return Response(result, status=status.HTTP_201_CREATED) 

В общем, я знаю, что это плохая практика, чтобы использовать общий обработчик исключения, если это не в коде верхнего уровня (для обеспечения красиво отформатированная ошибка для пользователя).
В этом случае возврат 400 с полезной нагрузкой с ошибкой дает мне дополнительную информацию с пользовательской стороны об ошибке. Другим вариантом, который я рассматриваю здесь, является удаление блока try/except, так что 201 будет возвращен при успешном завершении и 500 на ошибке.

Какова наилучшая практика в этом случае?

ответ

0

Вы также должны указать, как вы обрабатываете эти коды состояния в процессе производства: то есть пользовательские 400 и 500 страниц сообщений?

я следующий все время:

class MyDataView(APIView): 

    def post(self, request, format=None): 
     my_data = MyData() 
     try: 
      result = my_data.save(request.data) 
     except DatabaseError as dberr: 
      # here you can check the type, etc of the error 
      messages.error(request, "Database Error ...blah blah %s" % str(dberr)) 
      return redirect('/') # 
     else: 
      return Response(result, status=status.HTTP_201_CREATED) 

Затем вы используете пакет сообщений в базовой шаблон так, что он отображает хорошее сообщение пользователю где-то видного на этой странице.

, конечно, существует 100 способов преодоления этого. Я считаю, что пытаюсь понять, какие ошибки вы знаете о лучшем. Таким образом, если произошла непредвиденная ошибка, возникает статус 500, и электронная почта должна быть отправлена ​​вам с трассировкой стека (при правильной настройке в settings.py), и вы можете исправить проблему. Но если пользовательская ошибка введена, вы можете дать сообщение, которое пользователь может восстановить самостоятельно.

Примечание:

вы также можете сделать except Exception as ex:, а не ваш кружным путем получения информации об исключении.

Смежные вопросы