问题描述
我正在调查一个问题,该问题已通过以下格式的方法缩小为一个问题:
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)