0

我正在使用自定义 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);
    }
4

1 回答 1

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 方法中处理事务。它可以是重复的,但我发现它更具可读性并且可以更好地控制事务边界。

于 2013-01-31T14:47:25.557 回答