2011-01-16 3 views
0

Ich möchte jede außergewöhnliche Situation kennen, während es passiert ist. Ich glaube, ich Code in jeder catch-BlockSo injizieren in catch-Block zu senden Ausnahme E-Mail/SMS/Event-Log in C#

  1. Email senden
  2. send sms
  3. Schreib schreiben müssen, um es zu Protokolldatei
  4. Schreibereignisprotokoll usw.

    try { // mache etwas } catch (Exception ex) { // sende mich ... }

Gibt es eine einfache Möglichkeit, Catch-Blöcke zu injizieren, ohne Code zu schreiben?

PS: Während ich die Links der Antwort lese, stieß ich auf einige Artikel, und ich möchte Quoten zu meiner Frage hinzufügen.

Exception Handling Best Practices in .NET

Allgemeine Ausnahmen gefangen sollten veröffentlicht Es ist wirklich egal, was für die Anmeldung - log4net, EIF, Ereignisprotokoll, Tracelisteners, Textdateien usw. Was ist wirklich wichtig ist: wenn Sie haben eine generische Exception gefangen, melden Sie sie irgendwo. Aber logge es nur einmal ein - oft wird Code mit catch-Blöcken geritten, die Ausnahmen protokollieren, und du erhältst ein riesiges Protokoll mit zu vielen wiederholten Informationen, um nützlich zu sein.

+1

können Sie Frameworks von Drittanbietern wie Spring.NET verwenden? – djeeg

+0

Frühling! Ich wusste, dass es auf Java ist. Es wäre nett. Wenn Sie eine gute Quelle kennen, um Spring.Net zu lernen, teilen Sie bitte ... – uzay95

Antwort

2

Sie könnten Ihre eigene Ausnahmeklasse erstellen, die die Ausnahmebedingungsnachricht und/oder die Stapelüberwachung protokolliert. Wir tun dies mit log4net und es funktioniert, erfordert aber eine konsistente Implementierung. Sie möchten dies nur an einer Ebenen- oder Ebenengrenze tun, da für die meisten Situationen, wenn Sie nicht wissen, wie Sie mit einer Ausnahme umgehen, der Aufruf-Stack einfach aufgebläht werden sollte.

Etwas wie:

[Serializable] 
public class FooException : Exception 
{ 
    // Logger configured for email, file, etc. 
    static ILog _log = LogFactory.Create(); 

    public FooException(string message, Exception innerException) 
     : base(message, innerException) 
    { 
     _log.Error(message, innerException); 
    } 

    // ... 
} 

public class FooDataAccess<T> : IFooRepository 
{ 
    public T GetFoo() 
    { 
     // Consider creating general helper methods with 
     // Action, Func, parameters so that you only have 
     // to code the try ... catch block once. 
     try 
     {    
      // all exceptions caught 
     } 
     catch (Exception e) 
     { 
      throw new FooException(Exceptions.GetFooException, e); 
     } 
    }  
} 
+0

Das ist wirklich gut. Du hast die Enterprise Library benutzt, oder? Wie kann ich das Ziel des Logs auswählen und an LogFactory übergeben? – uzay95

+0

Kein EL benötigt, obwohl Sie ihren Ansatz verwenden könnten. Wir verwenden log4net, das das Ziel der Protokollausgabe von dem Prozess, der das Protokoll erstellt, abstrahiert, wodurch die Änderung einfacher wird. – si618

1

Sie können die aspektorientierte Programmierung mit PostSharp verwenden.

Allerdings ist eine einzige Fehlerbehandlung an der Spitze des Programms eine bessere Wahl meiner Meinung nach, wenn Sie nur Informationen sammeln und protokollieren. Sie wird bekommen den Stack-Trace auf diese Weise.

+0

Zuerst möchte ich lernen, es mit Code ohne Software zu tun, die ihren Preis hat. – uzay95

+0

@ uzay95 - Vielleicht hättest du das in deiner Frage sagen sollen. – Oded

+0

Ja. Aber es ist gut, dieses Werkzeug zu kennen. Vielen Dank. – uzay95

1

Sie können Spring.net, Unity oder MEF verwenden, die alle Open-Source sind und eine gute Dokumentation und Beispiele über Web. Aber wenn Sie nur dieses Problem haben, werde ich es persönlich lieber selbst machen oder Schließungen verwenden, um damit umzugehen.

Für die Ausnahmebehandlung können Sie Enterprise Library verwenden und auch die Quick start sehen, mit dieser sollten Sie nur einige Config und Ihre Ausnahmebehandler, lernen einfache Konfiguration und die Verwendung (wenn Sie Handler haben) dauert weniger als 10 Minuten (oder um die meiste Stunde).

0

Während die Idee jede einzelne Ausnahme immer interessant scheint, kann es zu viel des Guten.

In meiner Erfahrung, habe ich festgestellt, dass mit einem Logging-Framework (wie Log4net), die konfigurierbare Laufzeit ist, dieses Szenario recht gut behandelt.

Es gibt eine Reihe von Vorteilen. Der größte Vorteil, den ich gefunden habe, besteht darin, dass Sie, wenn Sie einen Logger pro Klasse verwenden, einstellen können, wann Sie auf Klassenebene Ausnahme-E-Mails erhalten möchten.

Dies bedeutet, dass Sie für die Ausnahmen, die als bekannt und nicht kritisch angesehen werden, einfach die Konfiguration ändern können, um E-Mail-Berichte für diese Ausnahme zu deaktivieren, aber bei der Protokollierung auf eine Textdatei auf der Festplatte zu belassen.

Da alle diese Optionen in Ihrer Protokollierungskonfiguration eingerichtet sind, kann das für die Überwachung zuständige Konfigurationsteam die Konfiguration ändern, ohne den Anwendungscode ändern zu müssen.

Mit einigen Logging-Frameworks können Sie sogar diese Neukonfiguration durchführen, während die Anwendung noch läuft.

Die einzige negative Seite ist, dass Sie sich sorgfältig damit beschäftigen müssen, wo Sie einen Fangblock haben.