重新抛出异常会导致我的数据无法保存

时间:2012-03-15 15:20:46

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

我有这段代码:

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;时,它表示它会保存但是当我查询数据库时它不在那里。我甚至可以在保存(在代码中)后立即通过我的数据上下文运行实体查询,并返回值,就好像它被保存一样(尽管可能使用缓存版本)。但如果我去查询后数据不存在......

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

任何可能导致此问题的想法?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

此调用是NServiceBus消息的结果。

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

我需要了解如何将此日志文件发布到事务外...

答案 2 :(得分:0)

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

你的问题很可能就是你所说的:消息处理在事务中发生了。您无法提交,否则您也会提交错误。因此,您必须找出可以挂钩到邮件处理异常处理的位置。

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