我有这样的代码(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?
答案 0 :(得分:2)
如果您的相对/绝对import
语句在任何地方都不匹配,则会发生此错误。如果存在不匹配,则可以在不同的上下文中多次加载目标模块。通常这不是问题,但它确实阻止不同加载的模块中的类比较相等(因此异常捕获问题)。
可能还有其他原因导致错误,但我建议您查看代码并确保导入gdata.service
模块的所有内容都明确提到gdata
包。即使在gdata
包本身内,使用service
模块的每个模块也应该通过from gdata import service
显式地从包中导入它,而不是通过相对导入:import service
。< / p>