2012-03-13 10 views
10

Sam pracuję nad pisaniem metod z try {stuff} catch (Exception e) {log, inne rzeczy} trochę rzucam, więc próbowałem dowiedzieć się, jak utworzyć atrybut, który pomoże odpadam. Sprawdziłem dość szczegółowo poniższe wątki i nie mogę sprawić, aby moja implementacja działała.Atrybut C# do otaczania przy próbie - 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

Moje web.config najwyższego poziomu jest ustawiony

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

a ja nie kompilacji w trybie debugowania. Mój atrybut jest poniżej:

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

i dzwonię go tutaj -

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

I nie może wydawać się uzyskać przerwania uderzy w atrybucie, lub jeśli zmienię kod statusu, aby go pokazać.

Skopiowałem również kod z atrybutu [HandleError] i nie mogę tam uzyskać punktu przerwania, więc myślę, że to jest coś nie tak z moją konfiguracją, ale nie wiem, co.

Wszelkie myśli lub pomysły będą bardzo mile widziane

Odpowiedz

1

Idąc z linku, który podałeś .net Attributes that handle exceptions - usage on a property accessor co chcesz nie jest możliwe (patrz wdrożenie w drugim fragmencie kodu Aaronaught).

Jeśli nie używasz jakiegoś szkieletu aspektu, musisz wdrożyć kod, który sprawdza obecność atrybutu i działa na nim samodzielnie, i uruchamia ten kod w każdym oświadczeniu catch(...).

Pomysł, który miałeś był świetny, i mógłbym go używać samodzielnie, ale ograniczenie wciąż utrzymuje, że musisz go wdrożyć na własną rękę.

HTH

Mario

+0

HM według MSDN http://msdn.microsoft.com/en-us/library/system.web.mvc.handleerrorattribute.aspx, HandleError „obejmuje atrybut służy do obsługi wyjątku, który jest wywoływany przez metodę akcji. ", a ja naprawdę nie widziałem nic ścisłego o akcesoriach własności. Czy to możliwe, ponieważ moja "metoda" nie jest metodą działania? – hermitt

+0

Nie jestem programistą w asp web, ale zakładam, że metoda akcji cofa się do kodu za metodami wywoływanymi przez kontroler mvc. Ponadto przyjmuję, że kontroler mvc wychwytuje wyjątek i ocenia atrybuty, jeśli metoda, a następnie postępuje zgodnie z tym. Jest to wzorzec, którego możesz również użyć - w haczyku (..) osoby dzwoniącej napisz jedną funkcję, która sprawdza atrybuty i działa odpowiednio. hth Mario –

Powiązane problemy