2013-05-28 47 views
3

我使用自定義異常來區分Python的默認異常和異常。在python中設置自定義異常的退出碼

當我引發異常時,是否有辦法定義自定義退出代碼?

class MyException(Exception): 
    pass 

def do_something_bad(): 
    raise MyException('This is a custom exception') 

if __name__ == '__main__': 
    try: 
     do_something_bad() 
    except: 
     print('Oops') # Do some exception handling 
     raise 

在此代碼中,主函數在try代碼中運行幾個函數。 當我捕捉到一個異常後,我想重新提高它以保留回溯堆棧。

的問題是,「養」永遠退出1. 我想退出與自定義退出代碼(我的自定義異常)的腳本,並在任何其他情況下1號出口。

我看了這個解決方案,但它不是我要找: Setting exit code in Python when an exception is raised

該解決方案迫使我在每個腳本中我使用的異常是否是默認還是自定義的檢查。

我希望我的自定義異常能夠告訴raise函數使用什麼退出代碼。

+0

我完全同意。你指出的那個老問題不得不將整個程序封裝在'try' /'except'子句中來解決這個問題。 – Alfe

回答

8

您可以覆蓋sys.excepthook做你想做的自己是什麼:

import sys 

class ExitCodeException(Exception): 
    "base class for all exceptions which shall set the exit code" 
    def getExitCode(self): 
    "meant to be overridden in subclass" 
    return 3 

def handleUncaughtException(exctype, value, trace): 
    oldHook(exctype, value, trace) 
    if isinstance(value, ExitCodeException): 
    sys.exit(value.getExitCode()) 

sys.excepthook, oldHook = handleUncaughtException, sys.excepthook 

這樣你就可以把這個代碼在所有的代碼只需要導入一個特殊的模塊。

+0

謝謝。我更喜歡將代碼封裝在try塊中,而不是覆蓋'sys.excepthook',但它仍然是一個很好的解決方案。 – Nir

+0

當然;我的印象是這個問題是關於沒有嘗試/除了習語之外的例子。 (或者,正如在問題中所述,如果除了區塊重新引發了被發現的例外。) – Alfe

+0

和:哇。在回答完成後的360天內接受我的回答。這應該給我一個特殊的徽章(長保險絲或東西);-) – Alfe