2017-03-29 29 views
2

我正在寫一個名爲Rule的類的方法check,它可以拋出RuleEnforced異常,其中的錯誤消息包含Rule的字符串表示形式,並將其引發。這是怎麼回事現在已經實現:在Python中,是否有對Exception的提升者的引用?

class RuleEnforced(Exception): 
    def __init__(self, rule, reason): 
     message = "The rule {rule} failed for the following reason: {reason}".format(rule=rule, reason=reason) 
     super(RuleEnforced, self).__init__(message) 

class Rule(object): 
    def check(self): 
     raise RuleEnforced(rule=self, reason="Why not?") 

rule=self參數始終是相同的,但是,我正在尋找一種方法,使使用的代碼更簡潔,在例外,像「self.caller.__class__ 「(用僞代碼)。有什麼辦法可以做到這一點?

+3

是的,在回溯。然而,這並不像傳入「自我」那樣容易。 –

回答

4

沒有更容易找到引發異常的實例的方法。

引發的異常包括回溯,即導致異常站點的調用堆棧。你可以從該堆棧中提取self(堆棧的局部和全局都被保留),但這並不像讀取rule=self那樣簡單易懂。請參閱inspect module overview of internal objects以查看tracebackframe對象的支持情況。

如果你想構建異常時(如此之前提高除外)訪問調用者,你必須檢查當前調用堆棧,並從主叫提取self。再次,這不是直觀或可讀的,並且取決於Python解釋器的實現細節。明確傳遞規則更清晰,更易讀。如果您確實想要走這條路線,請參閱sys._getframe() methodinspect module support for stack inspection

換句話說,從Zen of Python顯式優於隱式

相關問題