2009-12-09 110 views
3

我在執行程序中的異常系統時遇到了一些問題。 我在什麼地方找到了下面的一段代碼,我試圖用我的程序:實現python異常

class InvalidProgramStateException(Exception): 
    def __init__(self, expr, msg): 
     self.expr = expr 
     self.msg = msg 

我認爲味精必須是一個字符串消息顯示,但如何填補「expr的」當我想提出這個例外?我是否必須親手寫作?

raise InvalidProgramStateException(what_here?, "there was an error") 

回答

10

您的自定義異常實際上並不需要帶參數的。如果你沒有得到任何特定的錯誤信息或狀態異常封裝,這會工作得很好:

class MyException(Exception): 
    pass 

這將允許程序通過類型來捕獲這個異常的情況:

try: 
    raise MyException() 
except MyException: 
    print "Doing something with MyException" 
except: 
    print "Some other error occurred... handling it differently" 

如果您希望Exception具有一些有意義的字符串表示,或者具有能夠爲您的應用程序提供關於哪裏出錯的更多細節的屬性,那麼將附加參數傳遞給構造函數時也是如此。這些參數的數量,名稱和類型並不是由Python預先定義的......它們可以是任何東西。只是一定要提供一個自定義__str____unicode__方法,這樣可以提供一個有意義的文字描述:

class MyException(Exception): 

    def __init__(self, msg): 
     self.msg = msg 

    def __str__(self): 
     return "MyException with %s" % self.msg 

在你引述的例子的情況下,exprmsg參數專用於虛構的情況下,這個例子。如何這些可能被使用的做作的場景是:

def do_something(expr): 
    if 'foo' in expr: 
     raise InvalidProgramStateException(expr, "We don't allow foos here") 
    return 5 

user_input = 'foo bar' 
try: 
    do_something(user_input) 
except InvalidProgramStateException, e: 
    print "%s (using expression %s)" % (e.msg, e.expr) 

因爲它不出現,你的應用程序需要它,就放棄你並不需要的參數。

+3

您不需要提供新的構造函數或'__str __()'。默認參數將被放置在self.args中,並且它們將被'__str __()'打印。 – 2009-12-09 23:45:07

+0

感謝Bastien ......一個很好的補充。我太習慣於對例外以及它們在原木中的表現進行迂腐 - 我很感激你讓我回到地球。 – 2009-12-09 23:49:17

+1

你甚至不需要實例化:'raise MyException' – 2009-12-10 00:02:26