IExceptionFilter interface in MVC provide abstract method that we can override for our custom logic to handle exception and also we can derived our class from FilterAttribute so it can be use as a attribute on controllers or actions.
MVC provide HandleError attribute for handle any exception fire by controller, action or by any other attributes.In our custom exception filter we add more benefit for redirecting to a action or route when exception occur.
Here we have created three properties for storing routing values and exception.
Public Class CustomException
Inherits FilterAttribute
Implements IExceptionFilter
Private _exceptionType As Type = GetType(Exception)
Public Property Action As String
Public Property Controller As String
Public Property ExceptionType As Type
Get
Return _exceptionType
End Get
Set(value As Type)
If Not GetType(Exception).IsAssignableFrom(value) Then
Throw New ArgumentException("Exception Type not supported")
End If
End Set
End Property
End Class
In OnException method of our implementation we just check for prerequisites for parameters. and get the currentController and Action from RouteData of filterContext that we use for creating instance of HandleErrorInfo and storing it in TempData so we can display or log the error information.
Public Sub OnException(filterContext As System.Web.Mvc.ExceptionContext) Implements System.Web.Mvc.IExceptionFilter.OnException
If String.IsNullOrEmpty(Action) Or String.IsNullOrEmpty(Controller) Then
Throw New ArgumentException("values for action or controller not supplied")
End If
'if action is child action
If filterContext.IsChildAction Then
Return
End If
'if exception is handled by some other filter or custom error mode in web.config is not enabled
If filterContext.ExceptionHandled or Not filterContext.HttpContext.IsCustomErrorEnabled Then
Return
End If
Dim exception As Exception = filterContext.Exception
'if current exception is any httpexception then just return
If Not (New HttpException(Nothing, exception).GetHttpCode = 500) Then
Return
End If
'exception that is fire is instance of type that is passed as argument
If Not ExceptionType.IsInstanceOfType(exception) Then
Return
End If
Dim currentController As String = filterContext.RouteData.Values("Controller")
Dim currrentAction As String = filterContext.RouteData.Values("Action")
Dim errorInfo As New HandleErrorInfo(exception, currentController, currrentAction)
filterContext.Controller.TempData("Model") = errorInfo
filterContext.Result = New RedirectToRouteResult(New RouteValueDictionary(New With {.action = Action, .controller = Controller}))
filterContext.ExceptionHandled = True
filterContext.HttpContext.Response.Clear()
filterContext.HttpContext.Response.StatusCode = 500
' Certain versions of IIS will sometimes use their own error page when
' they detect a server error. Setting this property indicates that we
' want it to try to render ASP.NET MVC's error page instead.
filterContext.HttpContext.Response.TrySkipIisCustomErrors = True
End Sub
Next thing is main function of our custom implementation to redirect to action,we just set result property of filterContext to RedirectToRouteResult and pass action and controller as parameters.
ExceptionHandled property of filterContext is set true so other filter can know that exception is handled. Response.StatusCode = 500 that says this exception is not a standard httpException.

0 comments:
Post a Comment
Write your review about this post.