看來Python處理AttributeError
異常非標準。 當一個類定義了__getattr__
方法時,它將吞噬此異常,而不是傳播到堆棧的頂端。原始異常是否丟失?AttributeError和丟失的異常消息
class A(object):
@property
def test(self):
raise AttributeError('message which should not be lost')
return 'this would never return'
def __getattr__(self, name):
print 'Trying get attribute: ', name
# how decide if AttributeError was already raised ??
return 42
a = A()
print a.test
# Trying get attribute: test
# 42
想象AttributeError
異常可能在調用鏈中的任意深度的任何地方出現。
問題是如何保留與'message which should not be lost'
消息的原始異常實例?有沒有辦法如何保持AttributeError而不求助於像替換不同的異常類這樣的解決方法?
不要混合屬性,然後'__getattr__'。每當'__getattribute__'遇到一個'AttributeError'時'__getattr__'被調用。是的,這個例外很可能會丟失。 –
@MartijnPieters不幸的是有時候這是無法避免的。例如,我正在使用基於Django的商店應用程序,並在Form子類中引入'__getattr__'。在form的驗證中,所有的屬性異常都是靜音的,它促使我發現錯誤來自哪裏。 – joanbm