2012-03-13 12 views
10

Me encuentro escribiendo métodos con try {stuff} catch (Exception e) {log, other stuff} salir un poco, así que estaba tratando de averiguar cómo hacer un atributo para ayudar Sacarme. He revisado los siguientes hilos bastante extensamente, y parece que no puedo hacer que mi implementación funcione.Atributo C# para rodear con try - catch

attribute does not seem to act at all

ASP.NET MVC Controller.OnException not being called

.net Attributes that handle exceptions - usage on a property accessor

Mi web.config de nivel superior se establece en

<customErrors mode="On" defaultRedirect="/error.html"/> 

y estoy compilando en modo no-depuración. Mi atributo es el siguiente:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] 
public class SafeWebMethodAttribute: ActionFilterAttribute, IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     filterContext.ThrowIfNull(); 

     if (filterContext.ExceptionHandled) 
     { 
      return; 
     } 
     Log.LogException(filterContext.Exception); 
     filterContext.HttpContext.Response.StatusCode = 500; 
     filterContext.HttpContext.Response.Write(filterContext.Exception); 
     filterContext.ExceptionHandled = true; 
    } 
} 

y lo estoy llamando aquí -

public class Test : Controller 
{ 
    [SafeWebMethod] 
    public ActionResult Test() 
    { 
     throw new ArgumentException("test"); 
    } 
} 

Me parece que no puede conseguir un punto de interrupción de un golpe en el atributo, o si cambio de la código de estado para que aparezca.

También he copiado el código del atributo [HandleError], y tampoco puedo obtener un punto de interrupción, por lo que creo que hay algún problema con mi configuración, pero no sé qué.

Cualquier pensamiento o ideas serán bienvenidos

Respuesta

1

ir desde el enlace que ya ha proporcionado .net Attributes that handle exceptions - usage on a property accessor lo que quiere no es posible (ver aplicación en Aaronaught segundo fragmento de código).

A menos que utilice algún tipo de estructura de aspecto, debería implementar el código que verifica la presencia del atributo y actúa sobre él, y ejecutar ese código en cada instrucción catch(...).

La idea que tenías era excelente, y podría usarla en un marco por mi cuenta, pero la restricción aún es que tienes que implementarlo por tu cuenta.

hth

Mario

+0

hm, de acuerdo con MSDN, http://msdn.microsoft.com/en-us/library/system.web.mvc.handleerrorattribute.aspx, HandleError "representa un atributo que se utiliza para manejar una excepción que arroja un método de acción. ", y realmente no vi nada estricto sobre los accesores de propiedad. Dicho esto, ¿podría ser porque mi "método" no es un método de acción? – hermitt

+0

No estoy en la programación web asp, pero supongo que el método de acción revertir al código detrás de los métodos llamados por el controlador mvc. Además supongo que el controlador de mvc capta la excepción y evalúa los atributos si el método y luego procede en consecuencia. Este es un patrón que también podría usar: en la captura (...) de la persona que llama escribe una función que comprueba los atributos y actúa en consecuencia. hth Mario –