2011-01-12 16 views
1

ich in diesen Tagen eine API für einige Datenmanipulation bin writting und ich habe eine Frage gestellt, die ich nicht selbst beantworten kann: DBenutzerdefinierte Ausnahmeklasse Fehler aufmerksam zu machen und melden Sie sich

ich eine Ausnahmeklasse gemacht haben, die .NET erweitert Application Exception-Klasse, weil ich dort einige Funktionen hinzufügen möchte, die jedes Mal ausgeführt werden, wenn die API eine Ausnahme auslöst. Zum Beispiel möchte ich die Fehlermeldung und Stacktrace per SMS und E-Mail und ich möchte die innere Ausnahme über Log4net protokollieren. Ich weiß nicht, ob dies ein guter Ansatz für die benutzerdefinierte Ausnahmeklasse ist oder ob ich die Bedeutung der benutzerdefinierten Ausnahmen überstrapaziert habe.

Ich habe this article darüber lesen, wie die Ausnahme in C# zu erweitern, so wir hier mit meinem Beispiel Code gehen:

public class CustomExceptionClass : Exception 
{ 
    /// <summary> 
    /// I use custom functionality here everytime this exception occures 
    /// </summary> 
    /// <param name="errorMessage">error message</param> 
    /// <param name="innerEx">Inner exception that cause this exception</param> 
    public MyCustomException(string errorMessage, Exception innerEx) : base(errorMessage, innerEx) 
    { 
     //log exception 
     _log.ErrorFormat(errorMessage, innerEx); 
     //alert via sms and email 
     AlertMailer.SendAlertMessage(errorMessage, innerEx, innerEx.Message); 
    } 
} 
+1

Andere haben es bereits angedeutet, aber trotzdem: nur ein Ausnahmeobjekt zu konstruieren bedeutet nicht, dass es jemals geworfen wird, geschweige denn an der (ungefähren) Position im Code, der es konstruiert wurde.Beachten Sie auch, dass das StackTrace des Exception-Objekts zu diesem Zeitpunkt ziemlich nutzlos ist, da es "leer" sein wird (die Exception wurde zu diesem Zeitpunkt noch nicht ausgelöst). –

Antwort

4

Ich denke, dass Protokollierung und Alarmierung durch das Werfen einer benutzerdefinierten Ausnahme eine gültige Technik ist.

Sie sollten jedoch nicht im Ausnahmekonstruktor die Protokollierung und Warnung durchführen. Stattdessen sollten Sie die benutzerdefinierte Ausnahme in allen Einstiegspunkten Ihrer API abfangen und die Protokollierung und Warnmeldung im catch-Block durchführen. Zum Beispiel:

1

Benutzerdefinierte Ausnahmen sollten verwendet werden, um verschiedene Arten von Ausnahmen zu definieren.

  • Ausnahmen von der Datenbank
  • Ausnahmen von Datei io
  • Ausnahmen von Webdiensten

Sie sollen sehr einfach sein und enthalten keine andere Logik als die Zuweisung Variablen. Warum? Denn wenn der Exception-Konstruktor eine andere Exception wirft, wird es schwer sein, sie zu verfolgen.

Die Wege i behandeln diese Ausnahmen sind:

  1. AOP (Spring.NET)
  2. Spezifische try/
  3. Die globale Ausnahme abfängt Handler

In einem Programm

namespace ConsoleApplication1 { 
    class Program { 
     static void Main(string[] args) { 
      try { 
       //do something 
      } catch(Exception e) { 
       //log error 
      } 
     } 
    } 
} 

oder in einer Web-Site

public class ApplicationErrorModule : IHttpModule { 

    public void Init(HttpApplication context) { 
     context.Error += new EventHandler(context_Error); 
    } 

    private void context_Error(object sender, EventArgs e) { 
     //log error 
    } 
} 
0

Schwere Behandlungen wie Protokollierung und Senden von E-Mail nicht in dem Konstruktor der Ausnahme gehört. Sie sollten stattdessen die Ausnahme behandeln, indem Sie AOP als @petro-Vorschlag oder in einer Catch-Anweisung verwenden.

Verwandte Themen