【问题标题】:Setting an exit code for a custom exception in python在python中为自定义异常设置退出代码
【发布时间】:2013-05-23 02:24:29
【问题描述】:

我正在使用自定义异常来区分我的异常与 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。

我已经查看了这个解决方案,但这不是我想要的: Setting exit code in Python when an exception is raised

此解决方案强制我检查我使用的每个脚本,异常是默认的还是自定义的。

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

【问题讨论】:

  • 我完全同意。您指出的旧 Q 必须通过将整个程序封装在 try/except 子句中来解决问题。

标签: python exception raise


【解决方案1】:

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

这样你可以把这段代码放在一个特殊的模块中,你的所有代码只需要导入。

【讨论】:

  • 谢谢。我更喜欢将我的代码包装在 try 块中,而不是覆盖 sys.excepthook,但这仍然是一个不错的解决方案。
  • 当然;我的印象是这个问题是关于没有 try/except 成语捕捉异常的情况。 (或者,如问题本身所述,如果异常块重新引发捕获的异常。)
  • 还有:哇。在给出答案 360 天后接受我的答案。那应该给我一个特殊的徽章(长保险丝之类的);-)
猜你喜欢
  • 2011-10-06
  • 2014-08-31
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 2012-02-27
相关资源
最近更新 更多