2009-02-08 25 views
10

Tengo problemas para usar el atributo [HandleError] en las Acciones de mi controlador. No parece funcionar en absoluto (es decir, no importa si el filtro está allí o no) Obtuve los mismos resultados...). Cuando se lanza una excepción, obtengo el error de servidor de tono rojo estándar en la página de error de la aplicación '/' en lugar de mi vista personalizada.El atributo no parece funcionar en absoluto

He encontrado un par de otros hilos sobre el tema aquí en SO, y en la mayoría de los casos parece que establecer la opción customErrors en On en web.config resolvió el problema. No es para mí, así que necesito encontrar una solución diferente.

Mi acción del controlador:

[HandleError] 
public ActionResult Index() 
{ 
    throw new Exception("oops..."); 
    return View(); 
} 

En mi archivo web.config

<customErrors mode="On"></customErrors> 

he asegurado de que el archivo Error.aspx está en el directorio compartido, también. ¿Qué me estoy perdiendo?

Estoy ejecutando ASP.NET MVC RC Refresh.

Respuesta

11

Dos cosas útiles para saber:

Por defecto, HandleError no hace nada cuando se ejecuta en el servidor de desarrollo. La intención es mostrar a los desarrolladores más información útil:

public virtual void OnException(ExceptionContext filterContext) { 
    if (filterContext == null) { 
     throw new ArgumentNullException("filterContext"); 
    } 

    // If custom errors are disabled, we need to let the normal ASP.NET 
    // exception handler execute so that the user can see useful 
    // debugging information. 
    if (filterContext.ExceptionHandled 
     || ! filterContext.HttpContext.IsCustomErrorEnabled) { 
     return; 
    } 

Tenga en cuenta que este caso es precisamente lo que se supone customError de controlar. Si la configuración customError="On" no cambia este comportamiento:

  1. Compruebe la sintaxis.
  2. Asegúrese de editar el Web.config en la raíz del proyecto, no en las vistas.
  3. Asegúrate de que ningún código establece HttpContext.IsCustomErrorEnabled.
  4. Si todo lo demás falla, pruebe a depurar apagado en Web.config

En segundo lugar, hay ciertos tipos de errores que HandleError nunca manejar, sobre todo errores de compilación de ASP.NET. Usted no dice qué error está encontrando.

+0

gracias por su respuesta! su primera observación explica por qué no veo ningún efecto ... ¿hay alguna manera de probar el manejo de errores localmente antes de subir al servidor? ¿cómo? mi proyecto se compila, pero deliberadamente estoy lanzando excepciones de tiempo de ejecución para probar el manejo de errores. –

+0

Ver respuesta actualizada. –

+0

Hola de nuevo. Ahora he intentado customErrors = "On" con y sin una redirección predeterminada, customErrors = "Off", quitando completamente el nodo, y estableciendo debug = "false" - y la única diferencia es qué información se muestra en el error de tono rojo página ... ¿Es la depuración o el uso de Cassini lo que causa el problema? –

3

Debe especificar a qué página redireccionar también.

<customErrors mode="On" defaultRedirect="Error.aspx" /> 

EDIT: Lo sentimos el/Shared/parte no debería apostar que hay pero hay que decir MVC qué página para enviar al usuario con Error.aspx. Luego, la ruta predeterminada busca algo llamado Error.aspx en shared.

¡Era muy tarde! :) ¡Supongo que es por eso que alguien me dio un menos por la respuesta! :) Por lo menos funciona aquí amigo!

+0

Lo siento, pero no funciona con Error.aspx tampoco ... –

+0

Además, no debería ser necesario de acuerdo con este artículo http://weblogs.asp.net/ scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx (que es el más reciente que he podido encontrar, aunque solo está en PV4 ...) –

+0

Leí ese artículo, pero para mí el error no se maneja a menos que diga a dónde redirigir. – mhenrixon

3

Tengo el mismo problema y me tomó dos días completos para resolverlo finalmente. Resultó ser que recibí un error en la página Site.Master, y el Error.aspx utilizó esta misma página maestra como todas las demás páginas. Obviamente, el Error.aspx no podría lidiar con esa situación.

Mi solución es crear una página Error.master específica que sea liviana y no incluya ningún dato de modelo. Adicionalmente, creé un error estático.htm en caso de que ocurra un error desde Error.aspx. La configuración Web.config es la siguiente:

<customErrors mode="On"> 
    <error statusCode="500" redirect="Error.htm" /> 
</customErrors> 

Espero que ayude.

+0

Mi página Error.aspx también arrojaba su propia excepción. ¡Es un dolor depurarlo! –

+0

¡El error.htm parece devolver un código de estado de respuesta HTTP de 200 en lugar de 500 como debería! –

0

Otra razón para este problema puede ser,

En plantillas de aplicaciones de MVC (generada por VS2008/VS2008 Express), Error.aspx (generado por VS) utiliza página maestra.

Si la página maestra accede a cualquier ViewData arrojará excepción de referencia nula, entonces el error.aspx no se mostrará.

Usar este código simple como su Error.aspx, que va a resolver el problema, (junto con CustomErrors = On)

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %> 
<%= Model.Exception.Message %> 
0

Para solucionar el problema 404 cuando se suponía que el Error.aspx que se mostrarán , Tuve que excluir el Error.aspx de la sección httpHandler, lo que impidió que se accediera directamente a las vistas (alrededor del framework mvc 2). Hice esto poniendo Error.aspx en una subcarpeta 'Error' y poniendo un web.config en esta subcarpeta con un <remove path="*" verb="*" /> en la sección httpHandlers. Mi versión de este problema (y su solución) pueden ser específicas para MVC 2.

Recuerde que debe actualizar la referencia defaultRedirect, al mover Error.aspx :)

0

probé las sugerencias anteriores, pero nada funcionó para mí . ¿Cuál fue el truco para eliminar esta línea de mis acciones dentro de mi controlador de errores?

Response.StatusCode = (int)HttpStatusCode.NotFound; 

Estaba jalando de mi cabello ya que los mensajes de error de IIS interceptaban mi manejo de errores. Y aunque no es ideal, ya que quiero proporcionar ese código de estado en mi respuesta, descubrí que eliminarlo impedía que IIS 7+ interfiriera con mi manejo de errores.

DaTribe

+0

Si desea utilizar esto, y puede, primero debe establecer 'Response.TrySkipIisCustomErrors = true'. – ehdv

Cuestiones relacionadas