2 Stimmen

Auto-Ausnahme melden c#

Ich schreibe eine Automation (Testprojekt) mit vs2010. Ich habe bereits eine Logger-Klasse mit den relevanten Info(string), Debug(string) und Error(string, Exception) Methoden, die das ordnungsgemäße Schreiben von Nachrichten in eine Datei implementieren.

Jetzt verstehe ich, dass mein Info-Protokoll speziell im Code meiner Tests geschrieben werden muss, aber gibt es einen Weg, um die Fehlermeldungen automatisch zu schreiben, wie die Implementierung der geworfenen Ausnahmen? Die Ausnahmen sind Teil des Designs (ich muss sie werfen, um den Bestehens-/Durchfallzustand jedes Tests zu bestimmen).

Ich kann die grundlegende Implementierung durchführen, indem ich meinen gesamten Code in ein try-catch einhülle, im catch-Block das Logger.error() schreibe und dann die Ausnahme erneut werfe, wie folgt:

public class Test
{
    ["TestMethod"]
    public void RunTest()
    {
        try
        {
            //meinen Code hier ausführen
        }
        catch (Exception ex)
        {
            Logger.Error("Fehlermeldung", ex);
            throw;
        }
    }
}

Aber ich bin mir nicht sicher, ob es ein angemessenes Design ist, try-catch zu verwenden, um Fehler zu protokollieren.

Ich habe an zwei Dinge gedacht:

  1. Einen Listener-Thread erstellen, der meine Ausnahmen abfängt, protokolliert und erneut wirft...
  2. Die Exception-Klasse manipulieren, um meine Log.Error() zu verwenden (oder MyException von ihr abzuleiten und meinen Code so zu manipulieren, dass nur MyException geworfen wird).
  3. Ich habe bereits versucht, das Enterprise-Library zu installieren und den Logging-Block zu verwenden, bin mir aber nicht sicher, ob dies meinen Anforderungen entspricht (und es ist mir nicht gelungen, die Instanz des LogWriter zu erhalten oder sowieso Logger.Write zu verwenden).

Bin ich auf dem richtigen Weg? Gibt es andere Möglichkeiten, um solche "Fehler automatisch zu schreiben" zu implementieren?

Danke, Elad

1voto

Osa E Punkte 1651

Eine mögliche Möglichkeit, Ihr Anforderung zu erfüllen, besteht darin, Ihre Funktion und Methoden mit Logik zu umhüllen, um Logging/Instrumentierung zu behandeln. Sie können Ihre Testklassen alle von einer benutzerdefinierten Basisklasse erweitern lassen oder einfach eine Hilfsklasse erstellen und die Wrapper-Funktionalität aufrufen. Siehe das folgende Beispiel.

Hilfsklasse

class Utility
{
    public static void Wrap(Action method, params object[] parameters)
    {
        try
        {
            //weitere Protokollierung / Ereignisse - siehe Beispiel unten
            Debug.WriteLine("Eintreten : {0} @ {1}", method.Method.Name, DateTime.Now);
            foreach (var p in parameters)
            {
                Debug.WriteLine("\tParameter : {0}", new object[] { p });
            }

            method();
            //weitere Protokollierung / Ereignisse - siehe Beispiel unten
            Debug.WriteLine("Verlassen : {0} @ {1}", method.Method.Name, DateTime.Now);
        }
        catch (Exception ex)
        {
            //Ausnahme protokollieren
            throw;
        }
    }

    public static T Wrap(Func method, params object[] parameters)
    {
        try
        {
            //weitere Protokollierung / Ereignisse - siehe Beispiel unten
            Debug.WriteLine("Eintreten : {0} @ {1}", method.Method.Name, DateTime.Now);
            foreach (var p in parameters)
            {
                Debug.WriteLine("\tParameter : {0}", new object[]{p});
            }

            var retValue = method();
            //weitere Protokollierung / Ereignisse - siehe Beispiel unten
            Debug.WriteLine("Verlassen : {0} @ {1}", method.Method.Name, DateTime.Now);
            return retValue;
        }
        catch (Exception ex)
        {
            //Ausnahme protokollieren
            throw;
        }

    }
}

Beispielnutzung

public static void SayHello()
    {
        Utility.Wrap(() =>
            {
                SayHello(" Welt ");
            });
    }

    public static void SayHello(string name)
    {
        Utility.Wrap(() =>
        {
            Console.WriteLine("Hallo {0}", name);
        }, name);
    }

    public static int GetCount(string s)
    {
        return Utility.Wrap(() =>
        {
            return string.IsNullOrEmpty(s) ? 0 : s.Length;
        }, s);
    }

0voto

JMan Punkte 2611

Sie sollten try-catch-Blöcke nur auf möglichst hoher Ebene in Ihrer Anwendung implementieren. Dort können Sie Ihre Ausnahme abfangen und protokollieren.

Für unbehandelte Ausnahmen können Sie ein Ereignis koppeln, zum Beispiel: AppDomain.CurrentDomain.UnhandledException

In Asp können Sie On_Error verwenden. Es hängt vom Typ des Projekts ab.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X