重新处理异常会导致我的数据无法保存

本文关键字:我的 数据 保存 新处理 处理 异常 | 更新日期: 2023-09-27 18:28:07

我有这个代码:

catch (Exception e)
{
    try
    {
        transmitModel.AddAck(transmitBatchId,
          "<error><message>" + e.Message + "</message><stack>" + e.StackTrace +
          "</stack><Location>FromLisAtOMServer<Location>" +
          "<TransmitBatchId>" + message.TransmitBatchId +
          "</TransmitBatchId></error>", false, true);
    }
    // If we fail to log, we don't want that to bubble up... 
    // We want the real error to do that.
    catch (Exception){}
    // Re-throw the exception so that the service bus will 
    // move this off to the error queue.);
    throw;
}

AddAck方法将该字符串保存到数据库中(使用实体框架)。

当我在没有最后一条语句throw的情况下运行此操作时,它会将我的错误消息保存到数据库fine中。

当我有throw;时,它会说它保存了,但当我查询数据库时,它不在那里。我甚至可以在保存(在代码中)后立即通过数据上下文运行实体查询,它会像保存一样返回值(尽管可能使用缓存版本)。但如果我事后去查询,数据就不在了。。。。

我已经检查过,以确保没有其他逻辑导致在异常中删除该值。

你知道是什么原因造成的吗?

重新处理异常会导致我的数据无法保存

好吧,在这里发布一个答案,它很容易出现在我的脑海中,因为我曾经遇到过同样的问题,并发现这只是因为我没有提交DB事务。谢谢,:)

此调用是NServiceBus消息的结果。

我忘记了NServiceBus的东西是在分布式事务中运行的。因此,当我抛出异常时,它会回滚所有挂起的更改。

我需要了解如何让这个日志文件在交易之外发布。。。

NServiceBus可能为这类事情提供了钩子。

您的问题很可能就是您所说的:消息处理必须在事务中发生。您不能提交,否则您也在提交错误。因此,您必须找出在哪里可以挂接后消息处理异常处理。

带穿梭ESB(http://shuttle.codeplex.com/)我们使用管道来处理不同的用例,您可以挂接到由各种管道引发的PipelineException事件。Shuttle为开发人员提供了一种添加模块的能力,这些模块与各种事件挂钩。已经有一个SystemExceptionModule或多或少可以做你想做的事情。