处理asp.net mvc控制器中的异常

时间:2014-07-24 07:31:15

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

我创建了新属性,在逻辑中我有一些例外 我的问题是:如何在控制器中处理它并将其传递给视图? 在下面的代码中我抛出异常,我应该如何将其移动到视图?

这是控制器中的属性

[HttpPost]
[CheckToken]
public JsonResult Edit(Roles role)
{
    ...
}

这是属性

public class CheckToken : FilterAttribute, IAuthorizationFilter
{
    ....

    catch (HttpAntiForgeryException e)
    {
        throw new HttpAntiForgeryException("token not found");
    }
}

2 个答案:

答案 0 :(得分:2)

从书籍CLR Via C#,有关于例外处理的建议:

  

不要CatchEverything

     

开发人员无处不在的错误   没有经过适当使用的适当培训   例外是经常使用catchblocks   不当。当你发现异常时,你会说明你   期待这个例外,你明白它为什么会发生,你知道   如何处理它。

只有当我们知道如何从该异常中恢复我们的应用程序状态时,才应该捕获异常。

在你的代码中,你捕获异常而不做任何事情,而不仅仅是重新抛出它。这不是必需的。请注意,当您重新抛出异常时,CLR会重置其异常的起始点。

catch (HttpAntiForgeryException e)
{
    throw new HttpAntiForgeryException("token not found"); // CLR thinks this is where exception originated.
}

在您的情况下,我不会处理异常并将其传递给视图。我将让执行停止并在全局异常过滤器中处理它以返回错误并使用正确的http状态代码(例如:我们不应该返回状态为200的错误页面,可以选择将错误记录到DB进行进一步分析。

有关如何实现全局异常过滤器的信息:http://forums.asp.net/t/1848242.aspx?How+to+implement+global+error+handling+in+ASP+NET+Web+API

答案 1 :(得分:1)

而不是抛出exception..u可以像: -

catch (HttpAntiForgeryException e)
{
   filterContext.RouteData.Values.Add("Antiforgery", "token not found");
}

并在ur jsonresult中使用Routevalues:

[HttpPost]
[CheckToken]
public JsonResult GroupEdit(Roles role)
{
  ViewData["Message"] = RouteData.Values["Antiforgery"];
}