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

标签 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:
        print('Oops')  # Do some exception handling
        raise

在这段代码中,main 函数在 try 代码中运行了几个函数。 在捕获到异常后,我想重新引发它以保留回溯堆栈。

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

我看过这个解决方案,但它不是我要找的: Setting exit code in Python when an exception is raised

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

我希望我的自定义异常能够告诉 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

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

关于python - 在 python 中为自定义异常设置退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16786561/

相关文章:

python - 如何报告异常以备后用

Python 3 - raise 语句

python - 运算符(operator) 'is' 与方法的非常奇怪的行为

javascript - 通过 Flask 将串行数据传递给 javascript

python - 如何将此过程代码设计为基于类(面向对象)的?

java - 为什么 exception.printStackTrace() 被认为是不好的做法?

ruby - 如何在 ruby​​ 回溯中获取源和变量值?

Python,不带参数引发异常

python - 如何在交互模式下将带有 matplotlib 的 Python 代码嵌入到 C 中?

exception - 如何在 PowerShell 中配置调用深度?