2010-09-20 76 views
3

我有这样的代码(Python 2.5的,GAE开发服务器):的Python:捕捉特定的异常

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?

回答

2

如果您的相对/绝对import语句无处不匹配,则会发生此错误。如果不匹配,目标模块可以不止一次加载,并且在稍有不同的上下文中加载。通常这不是一个问题,但它确实阻止了来自不同加载模块的类从相等比较(因此是异常捕获问题)。

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