假设我有 mynamespace.myproduct :
<subscriber for="..interfaces.myinterface.IMyInterface
Products.CMFCore.interfaces.IActionSucceededEvent"
handler=".handlers.actionSucceeded"
/>
和 mynamespace.myproduct2 :
<subscriber for="..interfaces.myinterface.IMyInterface
Products.CMFCore.interfaces.IActionSucceededEvent"
handler=".handlers.actionSucceeded"
/>
(处理程序对每个产品执行不同的操作,即使它们在此示例中具有相同的名称)
我有一个具有自定义工作流程的自定义类型。我将使用doActionFor
从Python进行工作流转换,并在触发IActionSucceededEvent
时执行一些操作。
我的问题是:如果我发现错误.handlers.actionSucceeded
,如果发生错误,doActionFor
调用是否会被恢复(即使在IActionSucceededEvent
运行后)?如果没有,如果我使用IActionWillBeInvokedEvent
,我能否实现目标?对于同一个Products.CMFCore.interfaces.IActionSucceededEvent
界面使用..interfaces.myinterface.IMyInterface
,我会遇到两个不同产品的问题吗?
答案 0 :(得分:4)
答案 1 :(得分:3)
您可以通过将Plone调试级别转换为DEBUG(默认为info)来检查这一点,并将日志记录输出放入事件处理程序。在DEBUG日志记录中,Plone打印事务边界。
如果异常引发“505内部服务器错误”,它还会展开任何正在进行的事务(除非手动调用transaction.commit(),但普通代码不应该这样) 。
答案 2 :(得分:3)
根据@ Giacomo的回复,对于未捕获的任何异常,交易将被中止。因此,最好的办法是找出您想要容忍的错误并在订阅者log the exception中捕获这些异常,然后继续进行,以便仍然提交交易:
import logging
logger = logging.getLogger('mynamespace.myproduct')
...
def actionSucceeded(obj, event):
...
try:
my_dangerous_stuff(...)
except (TolerableException, AnotherTolerableException, ...):
logger.exception('Encountered an error while handling foo event')
...