处理ASP.NET MVC控制器中的异常

3

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

这是控制器中的属性。

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

这是属性

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

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

我看你是在使用HTTP状态码200(OK)向用户返回错误。 - Khanh TO
2个回答

2
从书籍CLR Via C#中,有一条关于异常处理的建议:

不要捕获所有异常

一个普遍犯的错误是,那些没有接受适当的异常使用指导培训的开发者会过度使用catch块,并且使用不当。当你捕获了一个异常时,你表达了这个异常是你预料到的,你理解了它为什么会发生,并且你知道如何处理它。

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

在您的代码中,您捕获异常却没有做任何事情,只是重新抛出它。这是没有必要的。请注意,当您重新抛出异常时,CLR 会重置它的起始点。

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

在您的情况下,我不会处理异常,而是将其传递给视图。我只会让执行停止,并在全局异常过滤器中处理它,向用户返回一个带有正确http状态代码的错误(例如:我们不应该返回一个状态码为200的错误页面),并可以选择将错误记录到数据库以供进一步分析。
关于如何实现全局异常过滤器的信息:http://forums.asp.net/t/1848242.aspx?How+to+implement+global+error+handling+in+ASP+NET+Web+API

1

不要抛出异常,可以这样做:

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

使用Routevalues在您的JsonResult中,如下所示:
[HttpPost]
[CheckToken]
public JsonResult GroupEdit(Roles role)
{
  ViewData["Message"] = RouteData.Values["Antiforgery"];
}

谢谢,我该如何从ViewData["Message"]中获取数据? - 07_05_GuyT
根据您的需求而定,@shopiaT。您可以将此ViewData值放入变量中并返回json(变量名,jsonresult.allowget),或者您也可以直接在jQuery中使用ViewData值,如'@ViewData["Message"]'。 - Kartikeya Khosla
你是不是指像这样的代码 if (ViewData["Message"] != null) return Json(objRes, JsonRequestBehavior.AllowGet);? - 07_05_GuyT
返回Json(new { objRes=ViewData["Message"] }, JsonRequestBehavior.AllowGet); - Kartikeya Khosla
你好,@shopiaT。欢迎您的到来。 - Kartikeya Khosla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接