2013-02-21 69 views
1

我有一種情況,我想利用自定義sys.excepthook。當一個程序拋出一個異常時,sys.except鉤子被調用並執行一些操作。是否可以取消尚未被捕獲的異常?

例子:

import sys 
def ehook(exctype, value, traceback): 
    t = 'Keys' 
    if exctype == AttributeError and value.args[0].split("'")[1] == t: 
     print "t %s" % (t,) 
    else: 
     sys.__excepthook__(exctype, value, traceback) 

sys.excepthook = ehook 



class Keys(): 
    @staticmethod 
    def x(): 
     print "this is Keys.x()" 


if __name__ == "__main__": 
    Keys.x() 
    Keys.noexist() 
    print "I want to continue here and beyond..." 

有沒有一種方法,我可以取消在excepthook活動異常,因此不會導致程序退出?

+0

你想處理所有異常,或'KeyError','AttributeError'等? – 2013-02-21 01:35:38

+0

只是AttributeError。我試圖實現的是以某種方式允許用戶調用諸如Keys.group(),Keys.revert()等等,其中Keys方法group(),revert()未定義,但我可以捕獲那些未定義的方法名稱並使用它們返回使用這些名稱的內容。像return str(「keyname_」+ the_undefined_name「)。我想避免必須包裝在嘗試except子句。 – 2013-02-21 02:06:46

+1

@DaveKierans:這聽起來像你正在尋找'__getattr__'。看到我編輯的答案 – BrenBarn 2013-02-21 02:10:30

回答

4

不會。在調用sys.excepthook時,頂級已經沒有發現異常,程序將在sys.excepthook完成工作後退出。 (請參閱the documentation。)通常情況下,異常在Python中不可恢復:您已經在抓住它們的地方處理它們,您不能只從它們發生的地方繼續。請參閱this thread進行一些討論。

編輯:根據您的評論,它聽起來並不像您想要捕捉整個程序中的所有異常。您只想捕獲某些對象的未定義屬性查找。如果是這樣的話,只需在你的課堂上定義一個__getattr__