How to hander exception in MVC2

Based on doing more and more practise, it seems that there are two exception source in MVC2. Before Action and After Action. I means that the exception caused before the incoming request been ActionInvoked and after been processed.

As is we know, every MVC request go through probably the following steps:

Request--->ControllerFactory-->Controller-->Action Invoker-->Action Method--->Response

Actally, if the request does do invoke certain action. We can catch the exception in Application_Error event in Global.asax.

If the exception caused by invoking certain action. We can hander the exception as following points:

1. Overrider OnException method in Controller or derive from FilterAttribute and implement IExceptionFilter(if you hope to save the exception in TempData variable).

        protected override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.ExceptionHandled) return;
            filterContext.Controller.TempData["Exception"] = filterContext.Exception;
            filterContext.Result = new RedirectToRouteResult("Default", new System.Web.Routing.RouteValueDictionary(
                new { action = "OnError" }
                ));
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
        }

2. Create cutomize ActionFiltterAttribute and implement ActionFilterAttribute.

    public class MyactionFitter :ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (filterContext.Exception != null)
            {
                filterContext.ExceptionHandled = true;
                filterContext.Result = new RedirectToRouteResult("Default", new System.Web.Routing.RouteValueDictionary(
                    new { action = "OnError" }
                    ));
            }
        }

You can mark the Controller or certain action with the predicated attribute.


namespace MvcApplication1.Controllers
{
    [MyactionFitter]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewData["Message"] = "Welcome to ASP.NET MVC!";
            
            return View();
        }

        public ActionResult About()
        {
            return View();
        }


        public ActionResult OnError() {
            return View();
        }
       
        public ActionResult RaiseError()
        {
            string[] arr = new string[1];
            string s = arr[2];
           return RedirectToAction("index");
        }
      
    }
}

posted on 2009-12-13 16:49  博览潇湘  阅读(338)  评论(0编辑  收藏  举报

导航