当前位置: 首页 > 知识库问答 >
问题:

如何阻止DevForce在EntityManager中吞咽异常。实体更改事件

暴向笛
2023-03-14

这是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;
        }
    }
}

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

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

在AdOnQuess(和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)。

共有1个答案

许马鲁
2023-03-14

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

 类似资料:
  • 我一直在玩CompletableFuture,发现了一件奇怪的事情。 如果在我的thenAccept调用中,断言失败,则不会传播异常。当时我尝试了更丑陋的东西: 不会发生任何事情,不会传播任何异常。我尝试使用诸如handle等方法以及与CompletableFutures中异常相关的其他方法,但失败了-没有一个方法像预期的那样传播异常。 当我调试CompletableFuture时,它会捕获如下异

  • 问题内容: 通常,我会遇到必须吞下/ 块中清理代码所引发的异常以防止原始异常被吞咽的情况。 例如: 假设记录任何异常不是方法块范围内的选项,而是由调用and 方法的代码完成。 吞没和方法抛出的异常是一个好主意吗?如果没有,什么是处理上述情况的更好方法,以免吞下异常? 问题答案: 我不喜欢捕捉和抛出异常。 如果你抓住它,做 一些 与它-即使它只是记录例外。 如果您不能执行任何操作,请不要捕获它-在方

  • 问题内容: 在我的特定情况下,我正在使用区分列策略。这意味着我的JPA实现(hibernate)创建带有特殊 DTYPE 列的 users 表。此列包含实体的类名称。例如,我的 用户 表可以具有 TrialUser* 和 PayingUser的 子类。这些类名称将在 DTYPE 列中,以便EntityManager从数据库加载实体时,它知道要实例化的类的类型。 *** __ 我尝试了两种转换实体类

  • 本文向大家介绍js阻止事件追加的具体实现,包括了js阻止事件追加的具体实现的使用技巧和注意事项,需要的朋友参考一下 有些时候可以使用 e.stopPropagation(); e.preventDefault();来阻止事件冒泡,和默认事件的执行。但不能阻止事件的追加。 什么情况下要阻止事件的追加呢? 比如: 点击“结账”,这样的操作时,结账本身有自己的事件,但结账前要判断是否登录。 我们可能会这

  • 我有自己的异常扩展,当调用时,我希望它向浏览器输出一条消息。但是,当我抛出这个异常时,抓住它并输出消息,但消息是一个跟踪。 这是我的全球。php: 我的代码片段: 输出到浏览器: 异常'异常'消息'密码未设置'在 /Users/kevin/Documents/Web/app/controllers/Settings/SetupController.php: 8堆栈跟踪:#0[内部功能]: Setu

  • 我正在Kotlin的Micronaut gRPC服务器上工作。默认情况下,如果我的gRPCendpoint抛出异常,它将在没有任何日志记录的情况下被吞噬(即使在调试级别),gRPC只返回一个状态:未知的错误响应,没有任何详细信息。 我希望我所有的gRPCendpoint在级别记录任何未捕获的异常及其堆栈跟踪。我该怎么做?我可以看到使用Micronaut服务工具(拦截/记录异常)、一些gRPC更改或