2011-03-18 88 views
1

編碼時,我必須經常這樣做;通過python中的裝飾器生成異常類

class MyClassException(Exception): 
    def __init__(self, _message): 
     self.message = _message 

class MyClass(object): 
    def __init__(self, value): 
     raise MyClassException("What's up?") 

這將會是很高興能夠通過裝飾呼籲有我的異常類,因爲所有這些虛擬類都繼承自Exception有什麼獨一無二的,但名稱。以下將是很好的例子;

@generic_exception_class 
class MyClass(object): 
    def __init__(self, value): 
     raise MyClassException("What's up?") 

既然沒有辦法讓MyClassException目前,直至裝飾被稱爲它會給我 語法 名稱錯誤不管是什麼。有沒有辦法在Python中以任何類似的方式做到這一點?

+0

只要實例化類,就會調用裝飾器。問題在哪裏? – 2011-03-18 05:33:10

+0

由MyClassException引起的語法錯誤未事先定義 – ocivelek 2011-03-18 05:34:00

+0

1)這將是一個名稱錯誤,而不是語法錯誤。 2)直到實際調用'__init __()'之後,Python纔會關心它不存在。 – 2011-03-18 05:35:06

回答

1

這是一種可能性。請注意,異常類將是裝飾類的成員,它不在全局範圍內。

# The decorator 
def class_with_exception(cls): 
    def init(self, _message=''): 
     self.message = _message 
    excname = 'ClsException' 
    excclass = type(excname, (Exception,), {'__init__': init}) 
    setattr(cls, excname, excclass) 
    return cls 

# example usage 
@class_with_exception 
class MyClass(object): 
    def __init__(self): 
     raise MyClass.ClsException('my message') 

# raises and catches exception 
try: 
    MyClass() 
except MyClass.ClsException: 
    print 'catching exception' 
+0

看起來像一個可行的想法:)謝謝。如果我們沒有看到更好的東西,我可以接受這個答覆。 – ocivelek 2011-03-18 07:28:36