Python: 捕获特定异常

3

我有这样的代码(Python 2.5,GAE开发服务器):

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

如果你的相对/绝对import语句不匹配,就会出现这个错误。如果存在不匹配,目标模块可能会加载多次,并以略微不同的上下文加载。通常这不是问题,但它确实防止了从不同加载的模块中比较相等的类(因此出现异常捕获问题)。

错误可能有其他原因,但我建议查看你的代码并确保所有导入gdata.service模块的内容都明确提到gdata包。即使在gdata包内部,每个使用service模块的模块也应该通过from gdata import service明确地从包中导入它,而不是通过相对导入:import service


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接