重新处理异常会导致我的数据无法保存
本文关键字:我的 数据 保存 新处理 处理 异常 | 更新日期: 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
或多或少可以做你想做的事情。