亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有功能的自定義異常

具有功能的自定義異常

瀟瀟雨雨 2021-08-14 17:47:36
我遇到了一個非常標準的問題,想知道我的解決方案是否正確。每次發生異常時,我都希望它被調用者捕獲并記錄下來,然后重新引發。由于我不想每次都重復記錄消息,所以我創建了一個自定義異常來保存消息數據和日志。class LoggingException(Exception):    def __init__(self, message, package_id):        # Get caller informat        caller = getframeinfo(stack()[2][0])        self.filename = caller.filename        self.function = caller.function        # Set message info and log        self.message = message        if (LogManager.log_handler is None):            print(message)        else:            LogManager.l(package_id, LogLevelEnum.ERROR, message)用例:def main_func():    try:        secondary_func()    except Exception as ex:        raise LoggingException("Some log") from exdef secondary_func():    raise LoggingException("Exception info")問題是我不完全確定有異常做任何操作是個好主意,這是通用的,因為它沒有標準的 python 解決方案。注意:由于產品限制,我沒有使用 python 日志記錄模塊。
查看完整描述

1 回答

?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

試圖獲取這樣的來電者信息是不可靠的。此外,在某些情況下,您并不感興趣的直接來電者。


異常記錄本身的想法似乎很明智。為了妥協,我會將日志記錄功能移到您可以顯式觸發的單獨方法中。畢竟,例外主要是常規對象:


class LoggingException(Exception):

    def __init__(self, message, package_id):

        # Set message info

        super.__init__(message)

        self.package_id = package_id


    def log(self, manager=None):

        if manager.log_handler is None:

            print(super().__str__())

        else:

            manager.l(self.package_id, LogLevelEnum.ERROR, super()..__str__())

現在,您可以隨時觸發日志記錄操作,而無需重新構建消息:


try:

    ...

except LoggingException as e:

    e.log(some_manager)

    raise

這使您可以選擇真正重新引發錯誤,如此處所示,或者像示例中那樣鏈接它。我強烈建議不要鏈接,除非你有很好的理由這樣做。

查看完整回答
反對 回復 2021-08-14
  • 1 回答
  • 0 關注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號