2009-07-02 28 views
5

No estoy seguro de cuál es la diferencia entre las diferentes formas de HandleError.Necesito más información sobre HandleError

En el asp.net mvc (proyecto por defecto) que ponen esto en la parte superior de la clase

[HandleError]

Así que estaba leyendo algún blog y la persona dice que esto

". ... le dice al marco que si ocurre una excepción no controlada en su controlador que en lugar de mostrar la Pantalla amarilla de la Muerte predeterminada, debería mostrar una vista llamada Error ".

http://blog.dantup.me.uk/2009/04/aspnet-mvc-handleerror-attribute-custom.html

lo hace significa que no debería estar alcanzando los errores (es decir, no hay capturas try)?

que entonces estaba buscando en un libro y tienen

[HandleError(ExceptionType=typeof(InsufficientMemoryException),View="About")] 
public ActionResult HandleError() 
{ 
    throw new 
InsufficientMemoryException(); 
    return View("Home"); 
} 

Así que sólo hay que poner en la parte superior de esta ActionResult y le dan un tipo de excepción. Mi primera pregunta es ¿qué sucede si tienes más de un error que estás lanzando? También pensé que deberías manejar todos los errores. Sé que esto es sólo un pequeño ejemplo, pero ¿no deberías atrapar MemoryException en alguna parte o esto arruina "HandleError" si lo haces?

También noté cuando lo miraba en VS que HandleError tiene 2 métodos de sobrecarga. Uno de ellos es el anterior y el otro es HandError().

Entonces, ¿por qué en el archivo de muestra asp.net MVC solo [HandleError] y no [HandleError()]? ¿Se usa uno para métodos de acción y uno para los de clase? Supongo que HandleError en la parte superior de la clase sería como HandleError (typeof (Exception))?

y Por último hay algo llamado IExceptionFilter. Entonces, ¿usar esto si quiere registrar todas las excepciones o si tiene algunas excepciones especiales con las que desea hacer algo diferente?

Me gusta si solo quisiera registrar todas las excepciones, sin importar qué haría solo una de estas y eso es todo, pero si quisiera hacer algo especial en una excepción de NullReference, ¿haría otra?

Estaba viendo este tutorial http://dimecasts.net/Casts/CastDetails/37 y no veo este "ActionFilterAttribute" del que están hablando. ¿Esto es de una versión anterior o algo así?

Como parece, tiene 4 métodos que puede usar y debe anularlos. En mi libro sólo se habla de ellos:

  1. IAuthorizationFilter
  2. IActionFilter
  3. IResultFilter
  4. IExceptionFilter

y son todas las interfaces así que no hay primordial. Sin embargo, ninguno de ellos tiene 4 métodos. Sólo una o 2.

Gracias

Ah, una cosa más. ¿Deberías probar siempre para cada excepción?Al igual que uno de mis métodos puede encontrar 7 excepciones diferentes. ¿Debería probar las 7 excepciones (es decir, arrojarlas) y eventualmente atraparlas y manejarlas (normalmente solo imprimo algún mensaje).

Si es así, VS2008 tiene algo que encuentra las excepciones que pueden suceder. Encuentro difícil decir a veces qué puede arrojar una excepción, entonces tengo que buscar cuáles.

Respuesta

2

"Nunca" atrapa System.Exception. Podría estar ocultando un problema. Mejor "Fail Fast".

únicas excepciones trampa que:

  • que conoces puede ocurrir y
  • que se puede recuperar con gracia de
  • y
  • Que no se puede comprobar de forma preventiva para

Así para responder a su último grupo de preguntas, no atraparía esas excepciones si puede verificar las condiciones en el código. Por ejemplo, si FileNotFound es uno de ellos, en lugar de atrapar FileNotFoundException, verifica el archivo. Si NullReference es uno, compruebe si el objeto es nulo en lugar de detectar la excepción.

La sugerencia de Andrew de utilizar ELMAH para registrar excepciones no controladas, o cualquier excepción en ese sentido, es excelente, IMO.

2

Lo primero que debe destacarse es que siempre debe atrapar errores que usted sabe que pueden ocurrir. Luego, no deberías tratar de atrapar cada error conocido por el hombre ... podrías estar en tu código todo el día agregando tales cosas. El atributo [HandleError] es esencialmente un controlador de error global que dice que si ocurre algún error en este controlador, los envía a la página configurada. ¡Esto es lindo ya que de la caja manejas todos los errores muy bien! Lo siguiente es manejar un error específico de cierta manera. Puede decir si se produce un error XYZ vaya a esta página en lugar de la página de error manejada globalmente. Si ocurren múltiples errores ... el primero gana. Es decir, si planea detectar dos tipos de errores ... lo que ocurra primero controlará la página a la que se redireccionará también.

Lo siguiente que puede considerar para cualquier sitio asp.net (webforms o mvc) es el marco de trabajo de ELMAH. Se registrará y capturará cada error que su sitio cause. Esto lo ayudará a abordar cualquier error del que no tenga conocimiento ... para que no tenga que planificarlos por adelantado. Lo bueno de este marco es que puede hacer que le envíe un correo electrónico cuando ocurre un error, así como también registrarlo en un archivo xml (entre otras posibilidades de configuración). ¡Muy útil!

Espero que haya respondido todas sus consultas!

+1

¿El error de Hmm so Handle es si usted quiere una página genérica para todos los errores? Si quieres errores más específicos, entonces póngalo sobre el actionView? ¿Qué tal "IExceptionFilter" cuando usaría este? ¿Sería aquí donde sería mi material de registro (o el código de Elmah)? Además, todavía no estoy seguro de cómo se ve el código? ¿No manejo los errores (try/catch) o todavía los manejo? No estoy seguro si los manejaría si eso confunde [HandleError]. Además, si los manejo no ¿eso impedirá que ELMAH framework haga cosas en las excepciones manejadas? ¿Tendría que registrar los conocidos manualmente? – chobo2

Cuestiones relacionadas