如何阻止DevForce吞噬EntityManager.EntityChanged事件中的exception

这是来自DevForce论坛的线程的另一个延续。 问题是如果更改是由查询或导入触发的,DevForce将默默地吞下EntityManager.EntityChanged事件抛出的任何exception。 相关代码如下所示:

internal virtual void OnEntityChanged(EntityChangedEventArgs args) { EventHandler entityChanged = this.EntityChanged; if (entityChanged == null) return; try { entityChanged(this, args); } catch { if (args.Action != EntityAction.AddOnQuery && args.Action != EntityAction.AddOnImport) { throw; } } } 

正如论坛post中提到的,这种方法的行为已经改变了一点加class。 现在吞下的东西比我第一次抱怨时少。 但对于我们的应用程序,我们真的需要知道什么时候出错。 仅仅因为我在执行查询或导入操作时碰巧出错并不意味着我不关心exception。

在上一篇论坛post中,这种行为的理由是:

吞咽在AddOnQuery(和AddOnImport)期间抛出的exception的论点是“在查询中间失败通常不是开发人员实际想要的”,因为它更可能由于编写错误的事件处理程序而发生

也许我们不常见:-),但在我们的应用程序中,事件处理程序如下所示:

 EntityManager.EntityChanged += (sender, e) => { if (e.Action == EntityAction.AddOnAttach || e.Action == EntityAction.AddOnImport || e.Action == EntityAction.AddOnQuery) { ((MyBaseClass) e.Entity).Initialize(); } }; 

这里抛出的任何exception都不会是因为编写错误的事件处理程序。 在这里抛出的任何exception都是因为实体在执行一次性初始化逻辑时非常困惑。 这种逻辑中的错误对我们非常重要。

我可以理解,普遍改变它可能是危险的,并导致其他应用程序开始破坏。 但是,如果有某种方式我们可以关闭此行为或某种其他方式告诉实体管理器不要吞下exception,那将是非常非常有用的。

我们之前的解决方法开始失败,因为我们希望在Web服务中使用所有业务逻辑,我们不能仅仅依靠错误日志来处理这类事情。 我们不能仅仅因为DevForce吞噬了一个可能致命的错误而向调用者返回“成功”响应。

我们正在使用DevForce的最新版本(截至撰写时:2012 – 7.2.3)。

版本7.2.4包含一个标志EntityManagerOptions.ThrowAllLoadExceptions来控制此行为。 发行说明。