Szukam prostego rozwiązania do wykonywania rejestrowania wyjątków w połączeniu z obsługą błędów w mojej aplikacji ASP.Net MVC 1.0.Wywołanie wyjątku ASP.Net MVC w połączeniu z obsługą błędów
Przeczytałem wiele artykułów, w tym zamieszczono tutaj pytania dotyczące StackOverflow, które zapewniają różne rozwiązania dla różnych sytuacji. Nadal nie jestem w stanie zaproponować rozwiązania, które odpowiada moim potrzebom.
Oto moje wymagania:
Aby móc korzystać z [HandleError] atrybut (lub jego odpowiednik) w moim kontrolera, aby obsłużyć wszystkie wyjątki, które mogą zostać wyrzucone z któregokolwiek z działań lub Wyświetleń . Powinno to obsłużyć wszystkie wyjątki, które nie były obsługiwane w żadnej z Akcji (jak opisano w punkcie 2). Chciałbym móc określić, do którego widoku należy przekierować użytkownika, w przypadkach błędów, dla wszystkich działań w kontrolerze.
Chcę móc określić atrybut [HandleError] (lub coś podobnego) u góry określonych akcji, aby wychwycić określone wyjątki i przekierować użytkowników do widoku odpowiedniego dla wyjątku. Wszystkie inne wyjątki muszą być nadal obsługiwane przez atrybut [HandleError] na kontrolerze.
W obu powyższych przypadkach chcę, aby wyjątki były rejestrowane za pomocą log4net (lub dowolnej innej biblioteki rejestrowania).
Jak mogę osiągnąć powyższe cele? Czytałem o tym, aby wszystkie moje kontrolery dziedziczyły z kontrolera bazowego, który nadpisuje metodę OnException, i w której robię logowanie. Będzie to jednak kłopotliwe z przekierowaniem użytkowników do odpowiednich widoków lub sprawi, że będzie bałagan.
Przeczytałem o pisaniu własnej akcji filtrowania, która implementuje IExceptionFilter, aby poradzić sobie z tym, ale będzie to sprzeczne z atrybutem [HandleError].
Do tej pory uważam, że najlepszym rozwiązaniem jest napisanie własnego atrybutu, który dziedziczy z HandleErrorAttribute. W ten sposób otrzymam całą funkcjonalność [HandleError] i mogę dodać własne logowanie log4net. Rozwiązanie jest następujące:
public class HandleErrorsAttribute: HandleErrorAttribute {
private log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.Exception != null)
{
log.Error("Error in Controller", filterContext.Exception);
}
base.OnException(filterContext);
}
}
Czy powyższy kod będzie działał zgodnie z moimi wymaganiami? Jeśli nie, jakie rozwiązanie spełnia moje wymagania?
Miło, dziękuję bardzo, wykorzystam to. – Kezzer
Podejrzewam, że ten kod ma błąd, w którym zakłada, że null nie jest zwracany dla RouteData.Values ["action"] - wywołanie. ToString() może spowodować, że twój uchwyt błędu wyrzuci wyjątek NullReferenceException. Nic nie jest bardziej frustrujące niż obsługa błędów zgłaszająca błąd. –