【问题标题】:Can I change the behaviour of "raise" or "Exception"? [duplicate]我可以改变“raise”或“Exception”的行为吗? [复制]
【发布时间】:2016-04-25 09:17:40
【问题描述】:

我的项目代码充满了如下块:

try:
    execute_some_code()
except Exception:
    print(datetime.datetime.now())
    raise

只是因为,如果我收到一条错误消息,我想知道它是什么时候发生的。我发现一遍又一遍地重复这段代码很愚蠢,我想把它排除在外。

我不想用可以捕获错误的东西来装饰execute_some_code(因为有时它只是一段代码而不是函数调用,有时我不需要完全相同的函数来装饰那)。我也不想将标准输出转移到记录所有内容的其他流,因为这也会影响发送到标准输出的所有其他内容。

理想情况下,我想覆盖raise 语句(在每次执行时也打印datetime.datetime.now())或Exception 类的行为,在其所有消息前面加上时间。我可以轻松地从 Exception 继承子类,但是我必须确保我的函数引发了这个子类的实例,并且我的代码重复量与目前一样多。

这两个选项都可以吗?

【问题讨论】:

  • 您是否可以选择使用调试器?
  • 我本来打算写关于 sys.excepthook 的文章,但 @IljaEverilä 找到了骗子。

标签: python


【解决方案1】:

您也许可以修改 python(我必须阅读代码才能确定它有多复杂),但是:

您确实想用不同的行为替换raise - 尝试和捕捉是解决问题的一种非常pythonic的方法,因此有很多代码可以很好地工作,例如调用一个方法并让该方法引发异常,在正常情况下捕获该异常。所以我们可以排除这种方法——你真的只想知道你关心的异常,而不是运行期间正常的异常。

每当创建 Exception 实例时触发某些操作也是如此 - 但是:

您也许可以覆盖全局命名空间;至少对于在您声明自己的 Exception 类后被初始化的东西。然后,您可以添加一个包含时间戳的 message 属性。不过不要那样做——实际上可能有些人依赖消息来自动对异常做出反应(糟糕的风格,但遗憾的是仍然很少见)。

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 2017-08-08
    • 1970-01-01
    • 2012-02-28
    • 2019-04-24
    • 2015-06-22
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多