try page net mvc handling example error custom create catch asp c# asp.net-mvc-2 exception-handling error-handling

c# - page - custom error mvc 5



Asp.net mvc anula OnException en el controlador base sigue propagándose a Application_Error (1)

Estoy tratando de devolver una vista, no emitir una redirección al usuario en función de ciertos errores que podrían ocurrir desde mi aplicación, quiero manejar los errores + registrarlos dentro de mi controlador base, no quiero que el error se propague hasta mi Global.asax - Método Application_Error (), ya que quiero que este método maneje cualquier otro error dentro de mi aplicación, por ejemplo, el usuario ingresa una URL falsa, ¿alguien ha encontrado una forma de evitar esto?

NOTA: He dejado mi código comentado ya que tuve una solución para algunos problemas, esto también muestra que tengo múltiples excepciones para un posible manejo ...

EDITAR: Si emito un RedirectToAction dentro de esta excepción OnException, todo funciona como se esperaba, pero solo quiero devolver la vista y no redireccionar ...

Mi método de controlador base es:

protected override void OnException(ExceptionContext filterContext) { //dont interfere if the exception is already handled if (filterContext.ExceptionHandled) return; //let the next request know what went wrong filterContext.Controller.TempData["exception"] = filterContext.Exception; //log exception _logging.Error(User.Identity.Name, ExceptionHelper.BuildWebExceptionMessage(filterContext.Exception)); //set up redirect to my global error handler //if (filterContext.Exception.GetType() == typeof(NoAccessException)) // filterContext.Result = View(new RouteValueDictionary // (new { area = "", controller = "Error", action = "PublicError" })); //else { //Only return view, no need for redirection filterContext.Result = View(new RouteValueDictionary (new { area = "", controller = "Error", action = "NoAccess" })); //} //advise subsequent exception filters not to interfere and stop // asp.net from showing yellow screen of death filterContext.ExceptionHandled = true; //erase any output already generated filterContext.HttpContext.Response.Clear(); //base.OnException(filterContext); }

Este método debería manejar cualquier otro error que pueda aparecer en mi aplicación, no quiero que los errores mencionados anteriormente se manejen dentro de mi Application_Error ()

protected void Application_Error() { Exception exception = Server.GetLastError(); // Log the exception. var logger = Container.Get<ILoggingService>(); logger.Error(User.Identity.Name, ExceptionHelper.BuildWebExceptionMessage(exception)); Response.Clear(); HttpException httpException = exception as HttpException; RouteData routeData = new RouteData(); routeData.Values.Add("controller", "Error"); //if (httpException == null) //{ routeData.Values.Add("action", "PublicError"); //} //else //It''s an Http Exception, Let''s handle it. //{ // switch (httpException.GetHttpCode()) // { // case 404: // // Page not found. // routeData.Values.Add("action", "HttpError404"); // break; // case 500: // // Server error. // routeData.Values.Add("action", "HttpError500"); // break; // // Here you can handle Views to other error codes. // // I choose a General error template // default: // routeData.Values.Add("action", "General"); // break; // } //} // Pass exception details to the target error View. routeData.Values.Add("error", exception); // Clear the error on server. Server.ClearError(); // Avoid IIS7 getting in the middle Response.TrySkipIisCustomErrors = true; // Call target Controller and pass the routeData. IController errorController = new ErrorController(); errorController.Execute(new RequestContext( new HttpContextWrapper(Context), routeData)); }


Lo siguiente debería funcionar:

protected override void OnException(ExceptionContext filterContext) { if (filterContext.ExceptionHandled) { return; } filterContext.Result = new ViewResult { ViewName = "~/Views/Shared/Error.aspx" }; filterContext.ExceptionHandled = true; }

También asegúrese de que no se lance una excepción en este método o se propagará a Application_Error .