2010-09-20 5 views
3

je un tel code (Python 2.5, GAE serveur dev):Python: attrapant exception particulière

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?) 

Je me suis donc point d'arrêt à la dernière ligne et sous débogueur je vois:

"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 

Ce que je manqué dans la gestion des exceptions python? Pourquoi isinstance (exc, gdata.service.TokenUpgradeFailed) est faux?

Répondre

2

Cette erreur peut se produire si vos instructions relatives/absolues import ne correspondent pas partout. S'il y a une discordance, le module cible peut être chargé plus d'une fois et dans des contextes légèrement différents. Habituellement, ce n'est pas un problème, mais cela empêche les classes des modules chargés différemment de se comparer comme égales (d'où le problème d'attraper les exceptions).

Il peut y avoir d'autres causes de l'erreur mais je suggère de parcourir votre code et de vous assurer que tout ce qui importe le module gdata.service mentionne explicitement le paquet gdata. Même dans le package gdata lui-même, chaque module utilisant le module service doit l'importer explicitement via le package from gdata import service plutôt que par l'importation relative: import service.

Questions connexes