2013-07-02 86 views
2

我有幾種方法可以引發我的自定義異常。在引發異常之後,我需要處理它,讓我們說日誌消息到控制檯並保存到數據庫中。在引發的異常中執行自定義代碼

我正在考慮在帖子標題中描述的一個瘋狂的解決方法 - 我可以將自定義代碼與日誌記錄和DB保存到__init__我的自定義異常的方法,所以每次引發異常,我只是沉默它,因爲所有需要的東西都會在異常初始化時完成。

我所知道的是,除了__init__本身也提出了另一個例外,但可以過處理:)

有沒有人試過?

爲什麼它是瘋狂的想法? :)

-

編輯:

我知道這有點瘋狂,我只是好奇你的意見的。我將嘗試附上我想要實現的內容:

我正在使用遠程數據,並且在通過網絡與其他服務器通信時,可能會出現一些問題,每個人都在其他某個地方: 1.網絡錯誤 - 啓用創建連接。 2. HTTP錯誤(404,500等) - 連接後; 3.遠程服務器可以返回一些其他錯誤太

由於這些問題發生在幾個不同的地方,我創建了自定義異常:

class CustomException(Exception): 
    pass 

到處提高了,我什麼時候才能趕上他們,例如:

try: 
    conn.open(url) 
except HTTPException as e: 
    raise CustomException('http') 

這只是一個僞示例。

這CustomException被逮住somewher更高,幾乎在每一個地方,我處理這個同樣的方式,即:

try: 
    place.populate() 
except CustomException as e: 
    handle_exception(e) 
    return False 

而且handle_exception保存有關問題的數據庫信息,做其他的事情也想節省place的對象狀態和acccess日期,但始終更新相同的東西。

所以我只是想知道如果把handle_exception代碼放在__init__之內會是一個非常瘋狂的想法,因爲每當出現異常時都會這樣做。

感謝您的意見!

+3

你有沒有一個例子。你失去了我...... – RickyA

+2

你可以在自定義異常的__init__內部進行日誌記錄和DB保存。但我不認爲這是我們應該這樣做的方式。通常在一個大項目中寫這樣的代碼會讓你自己和其他工作的人無法讀取代碼。 –

+2

你爲什麼要將異常處理打包到異常對象中?如果你想觸發一些日誌記錄,只需觸發一些日誌記錄而不會出現異常。例外情況應該用於「特殊」情況。如果你不把它看作是一個例外,那麼沒有理由讓它成爲例外。 –

回答

1

看起來你似乎在暗示兩件獨立的事情。首先,在異常中有一些自定義代碼的想法,這遠非瘋狂並且非常可行。

例子:

class CustomException(Exception): 
    def __init__(self, message, Errors): 
     # do stuff here 

不過,你提到自動捕捉每一個它的提出時間除外。沒有完成的原因很簡單,如果它不是一個錯誤,那麼不要將它作爲例外。我很難想象如果你不打算在任何時候用它做任何事情,那麼就有任何理由讓一個類變成一個例外。

個人,如果你想在拋出一個異常(有點硬不知道您的具體目標,對此置評),我建議把一個記錄器在__init__方法實質性邏輯,然後把你的邏輯直接在try/except這是畢竟,正是他們的目的。

1

如果你是做這樣的事情,這正如其他人所說是一個值得懷疑的目標,我建議你異常的__init__,然後安裝logging.Handlers用於登錄到數據庫,印刷到路由通過logging.Logger消息控制檯,或任何你想要的。然後,您的庫的用戶可以更容易,更標準化的方式控制(並擴展)系統。

+0

謝謝,我知道這一點,但我也在做其他事情,比如更新對象狀態等。 – aherok

相關問題