Python: ловить конкретное исключение - PullRequest
3 голосов
/ 20 сентября 2010

У меня есть такой код (Python 2.5, сервер GAE dev):

try:
    yt_service.UpgradeToSessionToken() // this line produces TokenUpgradeFailed
except gdata.service.TokenUpgradeFailed:
    return HttpResponseRedirect(auth_sub_url()) # this line will never be executed (why?)
except Exception, exc:
    return HttpResponseRedirect(auth_sub_url()) # instead this line is executed (why?)

Итак, я установил точку останова в последней строке и в отладчике вижу:

"exc"   TokenUpgradeFailed: {'status': 403, 'body': 'html stripped', 'reason': 'Non 200 response on upgrade'}   
"type(exc)" type: <class 'gdata.service.TokenUpgradeFailed'>
"exc is gdata.service.TokenUpgradeFailed"   bool: False 
"exc.__class__" type: <class 'gdata.service.TokenUpgradeFailed'>
"isinstance(exc, gdata.service.TokenUpgradeFailed)" bool: False 
"exc.__class__.__name__"    str: TokenUpgradeFailed 

Что я пропустил в обработке исключений Python? Почему isinstance (exc, gdata.service.TokenUpgradeFailed) имеет значение False?

1 Ответ

2 голосов
/ 20 сентября 2010

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

Могут быть и другие причины ошибки, но я предлагаю просмотреть ваш коди обеспечение того, чтобы все, что импортирует модуль gdata.service, явно упоминало пакет gdata.Даже внутри самого пакета gdata каждый модуль, использующий модуль service, должен явно импортировать его из пакета через from gdata import service, а не путем относительного импорта: import service.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...