2013-07-19 10 views
5

Używam kodu, który musi zostać uruchomiony tylko raz, ale zależy to od zasobów zewnętrznych i może się nie udać. Chcę, aby błąd pojawił się w dzienniku zdarzeń, ale nie chcę, aby użytkownik go widział. Chciałbym unikać używania niestandardowych stron błędów, jeśli to możliwe.Najczystszy sposób na zgłoszenie błędu, ale nie pokazanie użytkownikowi, że został on skorygowany (bez niestandardowych stron błędów).

Mogę wychwycić wyjątek i zapisać go w dzienniku zdarzeń, ale jestem zaniepokojony, że nie mogę zagwarantować, jaka będzie nazwa źródła zdarzeń asp.net (wydaje się zmieniać w zależności od wersji szkieletu .) Nie mogę też utworzyć własnego źródła zdarzeń, ponieważ wymaga to uprawnień administracyjnych.

Podejście, które Obecnie pracuję w kierunku jest trochę hack (która jeszcze nie działa) i wygląda to tak:

public void Init(HttpApplication context) 
    { 
     try 
     { 
      throw new Exception("test"); // This is where the code that errors would go 
     } 
     catch (Exception ex) 
     { 
      HttpContext.Current.Application.Add("CompilationFailed", ex); 
     } 
    } 

    private void context_BeginRequest(object sender, EventArgs e) 
    { 
     if (HttpContext.Current.Application.AllKeys.Contains("CompilationFailed")) 
     { 
      // It failed on Init - we can't throw an exception there so lets try it here 

      var origEx = (Exception)HttpContext.Current.Application["CompilationFailed"]; 
      // Only ever do this once 
      HttpContext.Current.Application.Remove("CompilationFailed"); 

      // This should just look like a normal page load to the user 
      // - it will be the first request to the site so we won't be 
      // interrupting any postbacks or anything 


      HttpContext.Current.Response.AddHeader("Location", "/"); 
      HttpContext.Current.Response.StatusCode = 301; 
      try 
      { 
       HttpContext.Current.Response.End(); 
      } 
      catch (ThreadAbortException ex) 
      { 
       throw origEx; 
      } 
     } 
    } 

Idealnie co naprawdę chciałbym to RecordException () metoda w IIS, jeśli coś takiego istnieje.

+0

EnterpriseLoggingLibrary doskonale nadaje się do takich rzeczy - może rejestrować wyjątki w bazie danych, dzienniku zdarzeń systemu Windows, pliku tekstowym lub cokolwiek innego, co można wymyślić. –

Odpowiedz

5

Polecam Elmah dla ASP.NET.

+1

Demo Elmah http://www.youtube.com/watch?v=xAcH41ZSksU – prospector

+0

Wygląda jak dobre rozwiązanie. Dzięki. – JoeS

1

Wygląda na to, że chcesz być powiadamiany o błędzie, ale nie chcesz, aby użytkownik o tym wiedział. możesz mieć przekierowanie strony (jeśli Błąd krytyczny) lub zakończyć wykonywanie reszty pliku/strony po wysłaniu wiadomości e-mail lub zapisaniu do źródła danych, do którego masz dostęp.

Powiązane problemy