处理异常和事务回滚

时间:2013-01-31 06:35:15

标签: c# .net nhibernate asp.net-mvc-4

我正在使用自定义ActionFilterAttribute,它启动NHibernate Session.Transaction

我想知道什么时候在Action中处理异常,我怎么能在ActionExceutedContext上得到它,以避免它执行事务提交而是调用回滚。如果未处理异常,它可以正常工作。需要一个解决方法。在处理异常的任何地方,我都不想写回滚。

 public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        _transactionHelper.BeginTransaction();
        base.OnActionExecuting(filterContext);
    } 


public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Exception == null)
            _transactionHelper.Commit();

        base.OnActionExecuted(filterContext);
    }

1 个答案:

答案 0 :(得分:0)

您可以在包含原始异常的catch块中抛出一个新异常:

try
{
    var x = 1 / 0;
}
catch (DivideByZeroException ex)
{
    // handle and allow transaction to commit
}
catch(Exception ex)
{
    // handle and throw new exception so that transaction is rolled back in filter
    throw new ExceptionCaughtInActionException(ex); // custom exception wrapper
}

使用这种方法,您的过滤器也可以进行一些日志记录。但是,在我看来,最好在action方法中处理事务。它可以是重复的,但我发现它更具可读性,可以更好地控制事务边界。