【问题标题】:How to try/catch return transaction.on_commit如何尝试/捕获返回 transaction.on_commit
【发布时间】:2020-08-20 13:56:38
【问题描述】:

我正在调查一个问题,我已将其范围缩小到以下格式的方法中的一个位置:

def method_shorthand(properties): 
  some stuff
  some more stuff

  return transaction.on_commit(
      lambda: external_function_call_I_do_not_control(properties))
   )

对于我可以重现的特定问题案例,external_function_call_I_do_not_control(触发 Segment 事件)不会发生/成功,尽管直到那时我已经确定所有信息都是正确的。对于这个代码库,'ATOMIC_REQUESTS':是的,所以我预测:

  • 提交实际上并没有发生(似乎不太可能;此函数被称为成功之前的代码块的最后一步)
  • 提交发生或没有活动事务(在这种情况下,它只是执行),但是当这个函数调用发生时,它会以某种方式出错 - 我的钱在这个上

所以我想在这个外部函数行中添加某种 try/catch 块,这样如果它运行时出现异常,我可以捕获它,记录信息,看看是怎么回事,这样我就可以修理它。问题是它都在 return transaction.on_commit 中,所以我尝试的所有内容似乎都是错误的语法,环顾四周我找不到这样做的例子。

有没有一种安全的方法可以在这个 return transaction.on_commit 中添加一个 try/catch 块?由于实际的函数调用是外部的并且我无法更改用于日志记录/调试的代码,因此还有其他想法可以在那里进行故障排除吗?

【问题讨论】:

    标签: python transactions return try-catch


    【解决方案1】:

    不要使用 lambda,而是使用整个函数,它可以让您做比 lambda 更复杂的事情(通常只是直接输入 -> 输出映射)。

    def method_shorthand(properties): 
      some stuff
      some more stuff
    
      def oncommit():
          try:
              external_function_call_I_do_not_control(properties)
          except Exception as e:
              # do whatever error handling needs to be done
    
      return transaction.on_commit(oncommit)
    

    【讨论】:

    • 啊,这看起来是一个打破它的好方法-会尝试回复-谢谢!!!
    • 这很有帮助!我能够像我希望的那样做到这一点,但是那个 lambda 是去年秋天有意添加的,所以我认为这是必要的(当我把它拿出来时,各种测试都失败了)。听起来当我们需要传递一个函数(而不是函数的结果)时使用 lambda,所以我想知道我是否可以弄清楚它最终执行的位置/时间并添加我的 try/except there 而不是?听起来今天的任务是阅读有关 lambda 的更多信息......
    • 一旦它们被创建,lambda 和函数之间就没有区别了。它们是无法区分的。唯一的区别是 lambda 可以内联编写,并且是一个简单的输入/输出。请注意 transaction.on_commit 是如何传递 oncommit 而不是 oncommit() - 它传递函数而不调用它,这与使用 lambda 所做的相同。
    • 我没有注意到这种区别——很有趣。我试图尽可能接近原始代码(其中确实包括“(属性)”,所以我猜它确实执行了函数调用) - 并且只是添加了额外的处理。原始源代码有一个 lambda 函数,它确实似乎在进行调用,而不只是传递函数名称,这是否不寻常?
    • @DianeKaplan 原始代码有一个 lambda 的原因可能是因为 transaction.on_commit() 想要一个具有 0 个参数的函数,但 external_function...() 需要一个参数。 lambda 充当中介,允许您有效地将单参数函数转换为零参数函数(毕竟,在您声明它时,您已经知道 properties 是什么,所以它可能也是一个常数)。
    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 2021-05-20
    • 2019-04-14
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    相关资源
    最近更新 更多