2013-07-19 6 views
5

Ich führe einen Code aus, der nur einmal ausgeführt werden muss, aber es hängt von externen Ressourcen ab und kann fehlschlagen. Ich möchte, dass der Fehler im Ereignisprotokoll angezeigt wird, ich möchte jedoch nicht, dass der Benutzer sie sieht. Ich möchte vermeiden, benutzerdefinierte Fehlerseiten zu verwenden, wenn möglich.Sauberste Möglichkeit, einen Fehler zu erzeugen, aber den Benutzer nicht anzuzeigen, dass er fehlerhaft ist (ohne benutzerdefinierte Fehlerseiten)

Ich konnte die Ausnahme abfangen und sie in das Ereignisprotokoll selbst schreiben, aber ich bin besorgt, dass ich nicht garantieren kann, wie der Name der ASP.net-Ereignisquelle wäre (es scheint sich abhängig von der Framework-Version zu ändern .) Ich kann auch keine eigene Ereignisquelle erstellen, da hierfür administrative Berechtigungen erforderlich sind.

Der Ansatz, den ich gerade arbeite in Richtung ist ein bisschen wie ein Hack (was noch nicht funktioniert), und es sieht wie folgt aus:

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

Im Idealfall, was ich würde wirklich ein RecordException ist () Methode innerhalb von IIS, wenn etwas ähnliches existiert.

+0

Die EnterpriseLoggingLibrary ist ideal für solche Dinge - kann Ausnahmen von der Datenbank, Windows Event Log, Textdatei oder irgendetwas anderes, was Sie sich vorstellen können. –

Antwort

5

Ich empfehle Elmah für ASP.NET.

+1

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

+0

Sieht aus wie eine gute Lösung. Vielen Dank. – JoeS

1

klingt so, als ob Sie benachrichtigt werden möchten, wenn ein Fehler auftritt, aber der Benutzer nicht darüber informiert werden soll. Sie könnten die Seite umleiten lassen (wenn Schwerwiegender Fehler) oder den Rest der Datei/Seite beenden, nachdem Sie eine E-Mail gesendet oder an eine Datenquelle geschrieben haben, auf die Sie Zugriff haben.