如何尝试/捕获返回交易on_commit

问题描述

我正在调查一个问题,该问题已通过以下格式的方法缩小为一个问题:

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”:正确,所以我可以预测:

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

因此,我想在此外部功能行中添加某种try / catch块,这样,如果在运行时发生异常,我可以捕获该异常,记录信息并查看问题所在,以便我可以修理它。问题在于这全都在return transaction.on_commit之内,所以我尝试的一切似乎都是错误的语法,而且环顾四周,我还没有找到执行此操作的示例。

是否有一种安全的方法可以在此return transaction.on_commit中添加try / catch块?由于实际的函数调用是外部的,并且我无法更改用于记录/调试的代码,因此还有其他解决故障的方法吗?

解决方法

使用lambda而不是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)