如何捕获.NET MVC中的过滤器抛出的异常?

时间:2009-03-23 19:11:40

标签: c# .net model-view-controller exception filter

我正在开发的应用程序上的一个过滤器检查用户是否拥有他们试图改变的项目。该操作由[RequiresOwnership]属性修饰,在属性逻辑中,我检查用户是否拥有该项,如果不是,则抛出UnauthorizedAccessException

我的问题是:我在哪里可以捕获该异常?理想情况下,我希望将用户重定向到一个页面,解释为什么不允许他们尝试做的事情,而不仅仅是显示异常页面。我不认为我会在属性修饰的动作中捕获异常,因此是否有一些应用程序的基础部分可以处理.NET MVC模型中抛出的异常?

编辑:我意识到我可以通过过滤器本身重定向到一个页面,但这对我来说似乎有点笨拙。通过属性抛出异常会很好,并且有一个标准的位置可以捕获和处理它们。

2 个答案:

答案 0 :(得分:2)

我认为您想要的是控制器上的[HandleError]属性,该属性采用错误处理程序视图的可选路径。默认为〜/ Views / Shared / Error.aspx;你可以在那里为你的特定例外添加额外的支持。

答案 1 :(得分:0)

我遇到了这个问题,我解决它的方法是将异常添加到FilterContext的TempData集合而不是抛出它。然后,您可以在操作方法中检查它,重新抛出它并适当地处理它:

在属性中:

if (/*some error condition*/)
   filterContext.Controller.TempData["Err"] = new Exception("An error");

在行动方法中:

var e = TempData["Err"] as Exception;
if (e != null)
    throw e;

这是一个不太理想的解决方案,但正如您所提到的,没有用于从属性中捕获异常的有用位置。

相关问题