2009-03-06 15 views
39

En dos aplicaciones diferentes, una personalizada y otra la aplicación MVC de muestra que obtiene con un nuevo proyecto VS2008 MVC, [HandleError] no detecta excepciones.ASP.net MVC [HandleError] no detecta excepciones

En la aplicación de ejemplo que tengo:

[HandleError] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 
     throw new Exception(); 
     return View(); 
    } 

    public ActionResult About() 
    { 
     return View(); 
    } 
} 

que es sólo el controlador por defecto con una excepción ser arrojado para la prueba.

Pero no funciona. En lugar de ir a la página default error.aspx muestra la información de depuración en el navegador.

El problema surgió por primera vez en una aplicación personalizada en la que estoy trabajando, lo que me llevó a probarlo con la aplicación de muestra. Pensando que tenía algo que ver con los cambios que hice en la aplicación personalizada, dejé la aplicación de muestra completamente sin cambios con la excepción (yuck) del lanzamiento en el método de índice.

Estoy perplejo. ¿Qué me estoy perdiendo?

Respuesta

65

En Web.config, customErrors cambio:

<system.web> 
    <customErrors mode="On"> 
    </customErrors> 

Si Modo está apagado o RemoteOnly, a continuación, verá la pantalla amarilla de la muerte en lugar de la página de error personalizada. El razonamiento es que los desarrolladores generalmente quieren la información más detallada en la pantalla amarilla de la muerte.

+4

que lo hizo. Gracias. –

+3

Lo hice y no funcionó. Lo que descubrí es que en una aplicación MVC2 hay más de un archivo Web.config en la plantilla predeterminada. Debe aplicar la etiqueta customErrors en el Web.config más avanzado de su solución. – Mike

+0

@Mike, eso es cierto para todas las versiones de MVC. –

15

Importante: ¡Tenga cuidado de que su página de error en sí no tenga ningún error!

Si lo hace, terminará con esa página de error personalizada de ASP.NET y terminará dando vueltas en círculos y rasgándose los pelos. Simplemente quite todo lo que pueda causar un error y pruébelo.

También con respecto a que 'customErrors' esté ENCENDIDO o APAGADO, hay varios factores que contribuyen a que se muestre o no la página de error amigable (su página Errors.aspx).

Ver this blog (excepto continuación)

HttpContext.IsCustomErrorEnabled - mira a tres fuentes diferentes

  1. El despliegue del web.config < > propiedad de menor sección. Esta es una propiedad útil que se establece al implementar su aplicación en un servidor de producción . Esto anula cualquier otra configuración de para errores personalizados.
  2. < de web.config customErrors > propiedad del modo de la sección. Esta configuración indica si los errores personalizados están habilitados en absoluto y, de ser así, si están habilitados solo para solicitudes remotas.
  3. La propiedad IsLocal del objeto HttpRequest. Si se habilitan los errores personalizados solo para solicitudes remotas, necesita saber si la solicitud proviene de un equipo remoto .

La idea aquí es que usted puede tener '' customErrors apagados durante el desarrollo - cuando usted desea ver los errores, y luego habilitarlo para la única producción.

Este MSDN article analiza el atributo más.

13

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 %> 
+4

"Si la página maestra accede a cualquier ViewData, lanzará la excepción de referencia nula "esa línea me devolvió la sensatez. ¡Gracias! –

8

He luchado con esto también y creo que entiendo el problema ahora.

En resumen los requisitos para tener [HandleError] trabajo como se esperaba son:

Debe habilitar errores personalizados en web.config Y también debe especificar donde su vista de error se encuentra en la etiqueta <customErrors>.

Ejemplo:

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

Dejando fuera de la parte defaultRedirect="Error" será en lugar producir un error 500 en el navegador - no la página de error ASP.NET (YSOD).

También no tiene que estar en modo de liberación. Probé esto con una compilación de depuración y funcionó bien.

Mi entorno era Visual Studio 2010 usando .NET 4 y la plantilla de proyecto estándar, "ASP.NET MVC 2 Web Application".

Lo que me confundió fue la documentación de MSDN para la clase HandleErrorAttribute. No dice explícitamente que debe activar los errores personalizados en web.config. Y asumí que todo lo que necesitaba era el atributo [Handle Error].

+0

Hizo exactamente eso y sigue teniendo el mismo problema. más detalles aquí: http://stackoverflow.com/questions/11231165/asp-net-mvc-errorhandler-not-showing-custom-error-page – user20358

+0

¡Todavía recibo un error de 500 en el navegador! – user20358

4

Hay una situación tonta que una vez me sucedió, por lo que podría ser útil para alguien.

Asegúrese de que ha agregado <customErrors mode="On" /> para el correcto archivo web.config.


veces (sobre todo, cuando se trabaja con algo como ReSharper, y abrir sus archivos con escribir su nombre, pero no a través de Explorador de soluciones), puede simplemente abrir un web.config ya sea desde la carpeta Vistas o incluso de otro proyecto.

+0

Nunca sabré por qué decidieron que necesitaban dos configuraciones web :( – martijn

+0

El "segundo" uno es para el motor Razor. Potencialmente, puede colocar sus vistas en cualquier lugar, por lo que el proyecto podría no tener el web.config (como para el proyecto web) o si desea su configuración por separado. Acepto, podría haberse hecho de alguna otra manera para evitar tales errores en la codificación, pero en general tiene sentido. – Agat

1

atención: en mi caso yo estaba tratando de obtener el atributo HandleError para coger un exception arrojado dentro de la Controller s constructor! Por supuesto que no lo atrapará. El atributo HandleError solo detecta excepciones lanzadas dentro de Controlleracciones. Es allí mismo, en la página de MSDN (debería haber prestado más atención a eso):

representa un atributo que se utiliza para manejar una excepción que es lanzada por un método de acción.

Otra cosa que sucedía es que nunca se había llamado al método reemplazado OnException(ExceptionContext exceptionContext) del Controlador. De nuevo: por supuesto no se llamaría ya que estaba lanzando una excepción dentro del constructor Controller.

Pasé 1 hora tratando de resolver esto. : o) Espero que ayude a la próxima alma ...

Como una pista: recuerde que el atributo HandleError solo capta 500 errores. Para el resto de los que usted debe declarar la sección <customErrors> en Web.config:

<customErrors mode="On"> 
    <error statusCode="403" redirect="~/403" /> 
    <error statusCode="404" redirect="~/404" /> 
</customErrors> 
Cuestiones relacionadas