【问题标题】:Possible to detect if I'm inside an 'except' clause in Python?可以检测我是否在 Python 中的“除外”子句中?
【发布时间】:2012-10-09 15:21:22
【问题描述】:

也就是说,我想要的是:

try:
    print inExceptClause()
    1/0
except Exception:
    print inExceptClause()
print inExceptClause()

... 会打印出来:

False
True
False

【问题讨论】:

  • 出于好奇,你为什么需要这样的功能?
  • def inExceptClause(answer=False): return answer,在异常之外调用为空,而在内部调用True?但猜你想要一个与程序相关的指示:)
  • 我不确定解释器中是否提供此类信息。另外,你可以有一个except,在另一个except里面,whicn在第三个except里面,等等。我能想到的最接近的是traceback.extract_stack(),但它没有提供任何关于的直接信息除外。

标签: python try-catch except


【解决方案1】:

sys.exc_info()

此函数返回一个包含三个值的元组,这些值提供信息 关于当前正在处理的异常。 (...) 如果不 异常正在堆栈上的任何地方处理,一个元组包含 返回三个 None 值。

另请参阅以下问题:

Python 3 traceback fails when no exception is active
Raising exceptions when an exception is already present in Python 3

【讨论】:

    【解决方案2】:

    我认为你的做法是错误的。您的“用例”似乎可以从代码中的多个点调用一个函数,有时会从异常处理程序中调用它。在那个函数中,你想知道是否抛出了异常,对吧?

    关键是,您不希望在不了解(或不应该了解)调用代码的函数中包含这种逻辑...理想情况下,您的大多数功能不会有。

    也就是说,您可能想要执行该功能,但只是部分执行。所以我建议以下两种选择之一:

    1. 将函数拆分为多个函数:一个函数具有额外的功能,并且会依次调用另一个具有可重用功能的函数。只需在需要时调用您需要的函数。

    2. 向函数添加参数:一个简单的布尔值可能足以包含或排除该函数的一小部分。

    现在,这并不是您问题的真正答案,但我觉得您从错误的角度看待您的问题......因此上述建议。

    【讨论】:

    • 我有一个日志记录函数,它在我的代码中的不同点被调用,如果我可以根据上下文自动对其进行稍微不同的格式化会很好......但我认为,最终,你'是对的,试图检测我是否在一个 except 子句中,最终,太不可靠了。我问是因为我认为(如果存在这样的事情)这可能是获得我想要的东西的一种快速方法,几乎​​不需要更改代码......但我认为也许可以从我的异常管理器中设置一些全局变量(或者,更好,使用上下文管理器),将提供更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多