在python中为自定义异常设置退出代码

在python中为自定义异常设置退出代码,python,exception,raise,Python,Exception,Raise,我使用自定义异常将我的异常与Python的默认异常区别开来 当我引发异常时,是否有方法定义自定义退出代码 class MyException(Exception): pass def do_something_bad(): raise MyException('This is a custom exception') if __name__ == '__main__': try: do_something_bad() except:

我使用自定义异常将我的异常与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
在这段代码中,main函数在try代码中运行一些函数。 捕获异常后,我希望重新引发它以保留回溯堆栈

问题是“升起”总是退出1。 我希望使用自定义退出代码(对于我的自定义异常)退出脚本,并在任何其他情况下退出1

我已经看过这个解决方案,但它不是我想要的:

这个解决方案迫使我签入我使用的每个脚本,无论异常是默认的还是自定义的


我希望我的自定义异常能够告诉raise函数要使用什么退出代码。

您可以覆盖
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

通过这种方式,您可以将此代码放入一个特殊模块中,您的所有代码只需导入即可。

我完全同意。您所指的旧Q由于必须将整个程序封装在
try
/
except
子句中而无法解决此问题。谢谢。我更喜欢将代码包装在try块中,而不是重写sys.excepthook,但这仍然是一个很好的解决方案;我的印象是,这个问题是关于没有try/except习语抓住例外的情况。(或者,如问题本身所述,如果except块重新引发捕获的异常。)和:哇。在给出答案360天后接受我的答案。那应该给我一个特别的徽章(长保险丝之类的);-)