如何阻止DevForce在EntityManager中吞咽异常?EntityChanged事件

本文关键字:异常 EntityChanged 事件 何阻止 DevForce EntityManager | 更新日期: 2023-09-27 18:14:06

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

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

正如论坛帖子中提到的,这个方法的行为随着时间的推移发生了一些变化。现在被吞下的东西比我第一次抱怨的时候少了。但是对于我们的应用程序,我们确实需要知道什么时候出了问题。仅仅因为在执行查询或导入操作时碰巧出错,并不意味着我不关心异常。

在上一篇论坛帖子中,这种行为的基本原理是:

吞下AddOnQuery(和AddOnImport)是"在查询中间失败通常不是开发者的真正意图是什么?"因为这更有可能由于编写错误的事件处理程序而发生

也许我们不常用:-),但在我们的应用程序中,事件处理程序看起来像这样:

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

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

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

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

我们使用的是DevForce的最新版本(截至撰写本文时:2012 - 7.2.3)。

如何阻止DevForce在EntityManager中吞咽异常?EntityChanged事件

版本7.2.4包含一个标志,EntityManagerOptions。throwallloadeexceptions,以控制此行为。发行说明。