2010-09-20 54 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