Почему исключение не перехватывается ‹‹ try ››?

У меня есть модульный тест Python (Django) FAIL из-за исключения, но ошибочный код находится в блоке try/except, написанном для этого исключения. Аналогичный блок обрабатывает исключение, когда оно вызывается напрямую.

Это проходит:

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#   Code catches a directly raised ImmediateHttpResponse
try:
    raise ImmediateHttpResponse(response=auth_result)
    self.fail()
except ImmediateHttpResponse, e:
    self.assertTrue(True)

Это, сразу после него, терпит неудачу:

# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#   FAIL
try:
    resp = resource.dispatch_list(request)  #<--- Line 172
    self.fail()
except ImmediateHttpResponse, e:
    self.assertTrue(True)

Вот след:

Traceback (most recent call last):
  File ".../web_app/tests/api/tastypie_authentication.py", line 172, in test_dispatch_list_diagnostic
  resource.dispatch_list(request)
  File ".../libraries/django_tastypie/tastypie/resources.py", line 410, in dispatch_list
  return self.dispatch('list', request, **kwargs)
  File ".../libraries/django_tastypie/tastypie/resources.py", line 434, in dispatch
  self.is_authenticated(request)
  File ".../libraries/django_tastypie/tastypie/resources.py", line 534, in is_authenticated
  raise ImmediateHttpResponse(response=auth_result)
ImmediateHttpResponse

Судя по трассировке, вызов dispatch_list() завершается ошибкой, так как вызывает исключение ‹‹ ImmediateHttpResponse >>. Но размещение именно такого исключения в блоке try не приводит к подобному сбою.

Почему блок try/except обрабатывает одно исключение, а не другое?

Обратите внимание, что тестовый код скопирован из тестового кода библиотеки, который работает должным образом. (Я использую тестовый код библиотеки для диагностики собственных ошибок реализации.)


person chernevik    schedule 30.09.2011    source источник
comment
Вы абсолютно уверены, что правильно написали ImmediateHttpResponse в своем реальном коде?   -  person Steven Rumbalski    schedule 30.09.2011
comment
Насколько может быть уверен новичок. Но после ‹‹ :%s/ImmediateHttpResponse/FOOBAR/g ›› поиск Immediate ничего не дает.   -  person chernevik    schedule 30.09.2011


Ответы (2)


Вы определили свой собственный ImmediateHttpResponse? (Я так не делаю.) Можно получить описываемый вами симптом, если deliciouspie вызывает tastypie.exceptions.ImmediateHttpResponse, в то время как ваш модульный тест тестирует локально определенный ImmediateHttpResponse.

Если да, то для решения проблемы удалите свое определение ImmediateHttpResponse и вставьте что-то вроде

from tastypie.exceptions import ImmediateHttpResponse

вместо этого в вашем модульном тесте.

person unutbu    schedule 30.09.2011
comment
Да, разместил мой ответ так же, как появился ваш. понял это, просматривая строковые значения исключения, которое я импортировал, и перехватывая исключение, возникшее во втором блоке за исключением, и получая строковое значение его типа. - person chernevik; 30.09.2011

Понятно, проблема заключалась в том, что мой импорт ImmediateHttpException отличался от импорта кода, вызвавшего ошибку.

Мой оператор импорта был:

from convoluted.directory.structure.tastypie.exceptions import ImmediateHttpResponse

Используемый код resource.py, вызвавший ошибку:

from tastypie.exceptions import ImmediateHttpResponse

Таким образом, он вызвал исключение != для того, который я импортировал, хотя их строковые выходные данные были одинаковыми.

Исправление моего оператора импорта решило проблему.

Спасибо за прослушивание!

person chernevik    schedule 30.09.2011