Error Handling in asp.net mvc 3

佐手、 提交于 2019-11-28 04:54:42

For Global Error Handling
All you have to do is change the customErrors mode="On" in web.config page
Error will be displayed through Error.cshtml resides in shared folder.

Make sure that Error.cshtml Layout is not null.
[It sould be something like: @{ Layout = "~/Views/Shared/_Layout.cshtml"; }
Or remove Layout=null code block]
A sample markup for Error.cshtml:-

@{ Layout = "~/Views/Shared/_Layout.cshtml"; } 

@model System.Web.Mvc.HandleErrorInfo

<!DOCTYPE html>
<html>
<head>
    <title>Error</title>
</head>
<body>
    <h2>
        Sorry, an error occurred while processing your request.
    </h2>
    <p>Controller Name: @Model.ControllerName</p>
    <p>Action Name : @Model.ActionName</p>
    <p>Message: @Model.Exception.Message</p>
</body>
</html>

For Specific Error Handling
Add HandleError attribute to specific action in controller class. Provide 'View' and 'ExceptionType' for that specific error.
A sample NotImplemented Exception Handler:

public class MyController: Controller
    {
        [HandleError(View = "NotImplErrorView", ExceptionType=typeof(NotImplementedException))]
        public ActionResult Index()
        {
            throw new NotImplementedException("This method is not implemented.");
            return View();
        }
}

I would suggest implementing a custom HandleErrorAttribute action filter.

See this link for more details:
http://msdn.microsoft.com/en-us/library/dd410203%28v=vs.90%29.aspx

Setting up a HandleErrorAttribute action filter gives you complete control over which actions are handled by the filter, and it's easy to set at the controller level, or even at the site level by setting it up on a custom base controller, and having all of your controllers inherit from the base controller.

Something else I do with this, is I have a separate HandleJsonErrorAttribute that responds to Ajax calls by returning a Json response, rather than the custom page.

UPDATE:

Per some questions below, here is an example of a HandleJsonErrorAttribute that I use:

public class HandleJsonErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        var serviceException = filterContext.Exception as ServiceException;

        filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

        filterContext.Result = new JsonResult { Data = new { message = serviceException == null ? "There was a problem with that request." : serviceException.Message } };

        filterContext.ExceptionHandled = true;
    }
}

And here is the jQuery that I use to handle these unhanded exceptions:

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
    showPopdown($.parseJSON(jqXHR.responseText).message);
});

This allows my Ajax methods to be very lightweight -- they just handle returning normal Json, and in the event of an unhanded exception, a message w/ an error status code gets wrapped in Json and returned.

Also, in my implementation, I have a custom ServiceException that I throw from services, and this sends the message from the service layer instead of a generic message.

The easiest way I think you can do that is using the elmah library.

Take a look at this: http://code.google.com/p/elmah/wiki/MVC and this http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx

I think the easiest way is using ExceptionHandler attribute since it's ready to use anytime you create a new ASP.NET MVC 3 project. You can still configure Web.config to use a custom error page and handling exceptions in global Application_Error method as usual but when an exception occurs the URL is not displayed as nice as the new MVC 3's way.

you can create custom exception in MVC if you want to customize a way of exception handling. you can find useful post here . http://www.professionals-helpdesk.com/2012/07/creating-custom-exception-filter-in-mvc.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!