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
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
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 –