2012-03-13 8 views
10

Mi trovo a scrivere metodi con try {stuff} catch (Exception e) {log, other stuff} per uscire un po ', quindi stavo cercando di capire come creare un attributo per aiutare io fuori. Ho controllato abbastanza estesamente i seguenti thread e non riesco a far funzionare la mia implementazione.Attributo C# per circondare 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

mio primo livello web.config è impostato su

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

e sto compilazione in modalità non-debug. Il mio attributo è seguito:

[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; 
    } 
} 

e sto chiamando qui -

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

io non riesco a ottenere un punto di interruzione colpito l'attributo, o se cambio il codice di stato per farlo apparire.

Ho anche copiato il codice dall'attributo [HandleError] e non riesco a ottenere un punto di interruzione anche lì, quindi penso che sia qualcosa di sbagliato con la mia configurazione, ma non riesco a capire cosa.

Tutti i pensieri o idee sarebbe molto apprezzato

risposta

1

Andando dal link che hai fornito .net Attributes that handle exceptions - usage on a property accessor ciò che si vuole non è possibile (vedi implementazione in Aaronaught secondo frammento di codice).

A meno che non si utilizzi un qualche tipo di framework di aspetto, è necessario implementare il codice che controlla la presenza dell'attributo e agire su di esso da solo ed eseguire tale codice in ogni istruzione catch(...).

L'idea che avevate era ottima, e potrei usarla in un framework da solo, ma il vincolo continua a ritenerlo necessario implementarlo da soli.

hth

Mario

+0

hm, secondo msdn, http://msdn.microsoft.com/en-us/library/system.web.mvc.handleerrorattribute.aspx, HandleError "rappresenta un attributo che è usato per gestire un'eccezione generata da un metodo di azione. ", e in effetti non ho visto nulla di rigido sugli accessor delle proprietà. Detto questo, potrebbe essere perché il mio "metodo" non è un metodo di azione? – hermitt

+0

Im non nella programmazione web asp ma presumo che il metodo di azione si inverta al codice dietro i metodi chiamati dal controller mvc. Suppongo inoltre che il controller mvc rilevi l'eccezione e valuti gli attributi se il metodo e quindi procede di conseguenza. Questo è lo schema che potresti anche usare - nel catch (..) del chiamante scrivi una funzione che controlla gli attributi e agisce di conseguenza. hth Mario –