Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using of HandleErrorAttribute in ASP.NET MVC application

I have a question about the best way of using HandleErrorAttribute in my MVC 5 application. As we know, we can add this attribute to global filters like that:

 filters.Add(new HandleErrorAttribute{View = "Error"});

This involves the app to show the 'Error' view every time when an unhandled exception is thrown in any level of app. But, if I have some logic in another global authorize or action filter, that produces some exception, then when the exception is thrown for first time, the app tries to redirect to the Error View, again other filters begin executing and produce the same exception again, so asp.net to avoid looping terminates the app. So what is the best way to use this HandleErrorAttribute to avoid such behavior? Thanks!

Edit: After some debugging I found that this is not the usual behavior of HandleErrorAttribute, so looping happens for me only when I use custom Routes f.e.

{key}/{controller}/{action}

and when some error occurs in the filter logic, then the app tries to redirect to the Error View, but again another filter logic begins to exectue and I even see an "Error" value in the {key} route parameter, so it is unwanted behavior. When I use the default route {controller}/{action} this doesn't happen and I get exactly to the Error View without executing any global filter logic a second time.

like image 859
igorGIS Avatar asked Sep 26 '13 10:09

igorGIS


People also ask

What is HandleErrorAttribute in MVC?

The HandleErrorAttribute attribute in ASP.NET MVC lets you specify how to handle an exception that is thrown by an action method. By default, when an action method with the HandleErrorAttribute attribute throws any exception, MVC displays the Error view that is located in the ~/Views/Shared folder.

How error logging is implemented in MVC?

You should always specify a default error page via your web. config <customErrors> and log unhandled exceptions that get called back to your HttpApplication Error method. You can use HandleErrorAttribute or OnException to provide fine-grained control of how you display error type messages to your users.

Why we use exception filters in MVC?

The Exception Filter in the ASP.NET MVC Application is used to handle any exceptions that occur during the ASP.NET MVC Request processing pipeline. The ASP.NET MVC Framework provides one in-built attribute called HandleError which is basically used to handle the unhandled exception in the MVC application.


2 Answers

You should wrap your action filter logic inside a try catch, then inside the catch block, redirect to the Error view and pass the Exception.

Your only other alternative is to ditch HandleError completely and use the Application_Error event inside Global.asax to manage your error handling. That way you can redirect to your Error action inside there regardless of where the error occured.

like image 144
mattytommo Avatar answered Oct 07 '22 13:10

mattytommo


Matt is right about global.asax... this is the example I followed http://www.digitallycreated.net/Blog/57/getting-the-correct-http-status-codes-out-of-asp.net-custom-error-pages

Then in each view I added: Response.StatusCode = 500; or which ever other code I wanted to show back to the client.

like image 32
KevinB Avatar answered Oct 07 '22 13:10

KevinB