2013-09-26 49 views
2

我想知道一個用戶定義的異常,我在我的Python程序中從一個類中提出的,沒有被我的main()中正確的異常處理程序處理。說我有一個類:爲什麼我的用戶定義的異常沒有正確處理?

class Pdbalog: 
    # Constructor 
    def __init__(self, logtype): 
     if logtype == 1 or logtype == 2: 
      # These are valid 
      self.logtypeV = logtype 
      ...<continue processing> 
     else: 
      # Invalid 
      raise Exception("Invalid Logtype") 

main樣子:

from pdbalog import * 
def main(): 
    try: 
     mylog = Pdbalog(10) 
     ...<other code here> 

    except "Invalid Logtype": 
     print('Exiting...') 
    except: 
     print('Unhandled exception') 
     raise 

main是運行在那裏我實例化Pdbalog對象的行會拋出一個例外(Exception("Invalid Logtype"))我期望和主(except "Invalid Logtype")中的異常處理程序將打印輸出字符串"Exiting..."。但是,它沒有。它由未處理的異常處理程序處理。結果發生的是字符串"Unhandled exception"正在輸出。爲什麼不是

except "Invalid Logtype": 

處理異常?

我使用的是舊版本的python(2.4)。一個錯誤消息

class InvalidLogType(Exception): 
    pass 

然後

raise InvalidLogType() 

然後

except InvalidLogType: 
    etc 
+0

捉基於錯誤的信息,我認爲你忘了添加'嘗試:''中的main()',我補充道。因爲我也是Python學習者。請檢查我的編輯....並祝賀1K :) –

回答

4

試試這個。 "Invalid Logtype"不是錯誤,只是一個str,所以你不能抓住它。

嘗試:

class InvalidLogtype(Exception): pass 

try: 
    raise InvalidLogType 
except InvalidLogType: 
    pass 

需要注意的是,你可以通過做

except Exception, e: 
    if e.args == ("Invalid Logtype",): 
     ... 

    else: 
     raise 
+0

「真」。 (還有8個) – Joe

+0

那麼你是否說我必須爲每個我想創建的自定義異常定義一個新類?我想要做的是創建一個「MyException」類,其中包含爲應用程序定義的所有例外。那可能嗎? – GregH

+0

你可以,但是爲每一個類創建一個類是用很多語言(Python,Java,C#等)完成事情的正常方式。爲什麼不?如果你不想捕捉它們,那麼你可以像以前一樣包含消息,但是如果你想捕捉它們,那麼你必須編寫自己的處理來匹配字符串。這更糟,因爲語言無法檢查您是否在尋找正確的字符串。如果你將來改變了信息會怎麼樣?使用自定義類可以處理這種情況。 – Joe

9

Exception("Invalid Logtype")仍然只是一個Exception,剛纔:

+0

'''實際上,你可以在Python2.4(和Python2.5,雖然它會給你一個DeprecationWarning)'' –

+1

作爲例外來提升和捕獲字符串。另外請注意,'except exception as e' syntax won在Python 2.4中不起作用。 –

+0

@MarkDickinson它應該是'except Exception,e:'**?** Error也是一個類? –

相關問題