11

我正在使用自定义异常来区分我的异常与 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 代码中运行了一些函数。捕获异常后,我想重新引发它以保留回溯堆栈。

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

我已经看过这个解决方案,但这不是我想要的: 在引发异常时在 Python 中设置退出代码

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

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

4

1 回答 1

14

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

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

于 2013-05-28T08:48:37.210 回答