2011-08-29 25 views
3

我只是想確保我以正確的「pythonic」方式做到這一點 - 我想確保我已經定義了 - 並且正在使用這個異常類。特別是eval(repr())邏輯 - 主要是爲了清潔,我明白你爲什麼最終引用了字符串repr()返回的引號,但我不喜歡記錄它們。這是一種定義和使用Python異常的適當方式嗎?

class IPCClientError(Exception): 
    """ General IPC Client Exception class """ 
    def __init__(self, value = "Unspecified error"): 
     self.val = value + ", see IPC client log for details." 

    def __str__(self): 
     return eval(repr(self.val)) 

當我拋出異常,我使用類似:

raise IPCClientError("Socket error") 

然後調用方法是這樣的:

except IPCClientError, exc: 
    self.log.error(str(exc)) 
    return ERROR 
+0

是的你做得對,除非你應該重新提出異常。 –

+0

你說得對,我應該,也許下一次我有機會做一些重構:) – Dave

+4

爲什麼你使用'return eval(repr(self.val))'而不是'return self.val'? – jamessan

回答

4
eval(repr(self.val)) 

伊克,什麼是你想在這裏完成?不是self.val已經應該是一個字符串?

避免引用repr重視的方法不是首先使用它。

如果您擔心傳遞給構造函數的值不會是字符串,那麼 - 無論如何,這將在構造函數中失敗(unicode歪曲),並且您只會在自定義異常之前獲得TypeError可。

至於如何處理異常,異常處理是一種藝術的,真的不是可以在這個空間所涵蓋...

+0

啊,剛剛有一個「唔」的時刻!謝謝。 – Dave

2

(除了已經被別人提及的eval東西)

在您的except聲明中,您應該編寫except IPCClientError as exc:(注意「as」),這是較新的,與python 3兼容的方式。 (其他語法不再適用於python 3,新的python 2.6和更高版本)

相關問題