2009-05-01 10 views
7

Oto, co usiłuję zrobić w moim Global.asax.vb:Jak rejestrować nieobsłużone wyjątki w ASP.NET MVC?

Public Class MvcApplication 
    Inherits System.Web.HttpApplication 

    Shared Sub RegisterRoutes(ByVal routes As RouteCollection) 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}") 
     routes.MapRoute(_ 
      "Error", _ 
      "error.html", _ 
      New With {.controller = "Error", _ 
         .action = "FriendlyError"} _ 
     ) 
     ... 
     'other routes go here' 
     ... 
    End Sub 

    Sub Application_Start() 
     RegisterRoutes(RouteTable.Routes) 
    End Sub 

    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs) 
     ... 
     'code here logs the unhandled exception and sends an email alert' 
     ... 
     Server.Transfer("http://www.example.com/error.html") 
    End Sub 

End Class 

Ale Server.Transfer zawiedzie:

Invalid path for child request 'http://www.example.com/error.html'. A virtual path is expected.

Jak mogę rozwiązać ten problem ? Albo, jaki jest lepszy sposób, aby to zrobić?

Odpowiedz

9

właśnie znalazłem to na blogu Scotta Hanselman za here zwanego ELMAH który jest błędem Logger/Handler, że można użyć bez konieczności zmiany kodu. Może chcesz zajrzeć do tego, ponieważ wydaje się, że działa dobrze z MVC.

+7

Używamy zmodyfikowanej wersji ELMAH tutaj na Stack Overflow - jest bardzo dobra. –

+2

@Jarrod - Jakie rzeczy włączyłeś do swojego widelca? –

+0

Reguły ELMAH - jest to bardziej przydatne niż log4net. MOIM ZDANIEM. – MikeJ

2

Trzeba specifiy wirtualną ścieżkę, czyli ścieżki względem podstawy aplikacji (czyli nie ma ścieżki do aplikacji zewnętrznych), więc coś takiego: Server.Transfer („error.html”) lub Server. przeniesienie ("/ error.html") lub Server.Transfer ("~/error.html")

+0

"~/error.html": Błąd podczas wykonywania żądania podrzędnego dla /error.html. –

+0

"/error.html": Błąd podczas wykonywania żądania podrzędnego dla /error.html. –

+0

"error.html": Błąd podczas wykonywania żądania podrzędnego dla błędu.html. –

3

ELMAH to doskonała procedura obsługi błędów do przechwytywania nieobsługiwanych wyjątków. Płynnie łączy się z aplikacją internetową za pomocą HttpModules i oferuje różne opcje powiadamiania i rejestrowania.

Cechy:

  • SQL, XML, SQLite, WEW pozyskujących
  • powiadomienie email
  • RSS
  • Szczegółowe! Rejestrowanie wyjątków
  • Łatwa integracja
  • Błąd Sygnalizacja - sygnał błędu obsługi błędu podczas „obumieranie ładnie” dla użytkownika

I FYI, SO używa ELMAH, aczkolwiek wersja rozwidloną. Jest to najlepszy architectural explanation i setup tutorial

2

Domyślnie aplikacje ASP.NET MVC mają widok dzielony/Error.aspx, dziedzicząc z

System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo> 

Jeśli kontroler używa atrybutu [HandleError], wszystkie wyjątki kontynuuj bańkę, dopóki nie zostaniesz złapany, a skończą na tej stronie.

po prostu dodaje się Page_Load inline (ważne w tym przypadku, ponieważ jest to koniec linii): Po tym, wiadomość

<script runat="server"> 
    Sub Page_Load(ByVal Sender As System.Object, ByVal e As System.EventArgs) 
    MyExceptionHandlerService.LogException("exceptionsource", this.Model.Exception) 
    End Sub 
</script> 

przyjazny „Przepraszam ...”. Zdecydowanie wygląda na to, że ELMAH jest mocniejszy, ale dla moich potrzeb było to wystarczające.

Powiązane problemy