【问题标题】:Rethrowing an exception causes my data to not save重新抛出异常会导致我的数据无法保存
【发布时间】:2012-03-15 15:20:45
【问题描述】:

我有这个代码:

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 的情况下运行它时,它会将我的错误消息保存到数据库中。

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

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

有什么可能导致这种情况的想法吗?

【问题讨论】:

  • 听起来好像你没有提交数据库事务?
  • 但是将日志提交到数据库的代码在哪里?
  • 事务不是被栈中某处的 finally 语句回滚了吗?
  • 您是否真的将 XML 保存到数据库中而不是填充列,还是服务调用?
  • @SimonWang - 作为答案发布,我会接受。

标签: c# .net entity-framework exception-handling nservicebus


【解决方案1】:

好的,在这里作为答案发布,我很容易想到它,因为我曾经遇到过同样的问题,并且发现这只是因为我没有提交数据库事务。 谢谢,:)

【讨论】:

    【解决方案2】:

    此调用是 NServiceBus 消息的结果。

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

    我需要找出如何让这个日志文件在事务之外发布...

    【讨论】:

      【解决方案3】:

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

      您的问题很可能就是您所说的:消息处理必须发生在事务中。你不能提交,否则你也犯了错误。所以你一定要找出在哪里可以挂钩到 post 消息处理异常处理。

      通过 Shuttle ESB (http://shuttle.codeplex.com/),我们使用管道来处理不同的用例,您可以挂钩到由各种管道引发的 PipelineException 事件。 Shuttle 能够让开发人员添加挂钩到各种事件的模块。已经有一个 SystemExceptionModule 或多或少地做了你想做的事情。

      【讨论】:

        猜你喜欢
        • 2016-01-06
        • 1970-01-01
        • 1970-01-01
        • 2014-03-15
        • 2016-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-17
        相关资源
        最近更新 更多