我正在使用自定义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);
}
答案 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方法中处理事务。它可以是重复的,但我发现它更具可读性,可以更好地控制事务边界。