Laden...

Klasse bzw. Möglichkeit zum globalen Abfangen von exceptions?

Erstellt von thefiloe vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.081 Views
T
thefiloe Themenstarter:in
87 Beiträge seit 2010
vor 12 Jahren
Klasse bzw. Möglichkeit zum globalen Abfangen von exceptions?

Ich suche eine Methode am besten eine Logfile-Verwaltung zu erstellen. Dazu wäre es gut wenn bevor jeder exception am besten eine Art event ausgelöst wird in der ich den Fehler in einer Logdatei notieren kann und anschließend die Exception ausgelöst wird.

Gibt es da etwas fertiges oder was wäre ein Ansatz für so eine Verwaltung?
Ich dachte schon direkt in der main abzufangen doch das problem ist, da ich keine main besitzte (weil Klassenbibliothek) könnte das ein Problem werden.

1.378 Beiträge seit 2006
vor 12 Jahren

AOP (Aspektorientierte Programmierung) fällt mir da auf Anhieb ein. Zum Beispiel mit PostSharp.

Lg, XXX

T
thefiloe Themenstarter:in
87 Beiträge seit 2010
vor 12 Jahren

ok werd ich mal googeln. Danke

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo thefiloe,

wenn es (überwiegend) um eigene Exception-Klassen geht, kann man diese natürlich so schreiben, dass sie sich (im Konstruktor) selbst loggen.

Aber ansonsten hat xxxprod schon recht. Gerade Logging ist ja die Paradedisziplin für AOP.

herbivore

T
thefiloe Themenstarter:in
87 Beiträge seit 2010
vor 12 Jahren

es handelt sich zu ca. 60% .net exceptions und 40% eigene. Jedoch scheint mir PostSharp sehr umfangreich zu sein. Gibt es 1. nichts einfacheres. 2. Nach was muss ich bei Postsharp genau suchen?

1.378 Beiträge seit 2006
vor 12 Jahren

Zum Beispiel nach "PostSharp Logging".

  1. Treffer sieht schon sehr brauchbar aus: Link

Lg, XXX

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo thefiloe,

wenn du zum ersten Mal AOP machst, wirst du einen nicht unerheblichen Einarbeitungsaufwand haben. Da bildet PostSharp keine Ausnahme. Das ist so und das wird sich nicht vermeiden lassen. Du wirst selbst entscheiden müssen, ob es dir das wert ist. Wenn du dir die Zeit nimmst, ist es relativ egal, wo du mit der Einarbeitung beginnst. Wenn du die Zeit nicht hast oder nicht aufwenden willst, wirst du mit einer unschöneren Lösung mit klassischen Mitteln vorlieb nehmen müssen. Bei letzterer wirst du aber bei fertigen .NET Exceptions nicht drumrum kommen, diese überall explizit zu fangen.

herbivore

T
thefiloe Themenstarter:in
87 Beiträge seit 2010
vor 12 Jahren

@xxxprod danke ich hatte die einführung gefunden aber nicht die fortsetzung des artikels 😃

@herbivore nun ja ich höre heute das erste mal von aop und das obwohl ich recht viel in c# programmiere. Ich werde es mir dann genauer anschauen wenn es eine nennenswerte bedeutung im alltag hat.
Doch da es das anscheinend hat werde ich mich da wohl einarbeiten müssen 😃

danke für die infos.

T
thefiloe Themenstarter:in
87 Beiträge seit 2010
vor 12 Jahren

Ok ich habe mir das ganze jetzt angeschaut. Und zwar habe ich folgendes Beispiel angeschaut:

[DatabaseExceptionWrapper]
        private void Test()
        {
            throw new Exception("Hallo Welt");
        }

        
    }
    [Serializable]
    public class DatabaseExceptionWrapper : OnExceptionAspect
    {
        public override void OnException(MethodExecutionArgs args)
        {
            string msg = string.Format("{0} had an error @ {1}: {2}\n{3}",
                args.Method.Name, DateTime.Now,
                args.Exception.Message, args.Exception.StackTrace);

            Console.WriteLine(args);

            throw new Exception("There was a problem");
        }
    }

Nun macht das aber auch nicht das was ich will. Weil wenn ich jetzt auch das

throw new Exception("There was a problem");

auskommentiere schmeißt das ganze trotzdem noch eine Exception. Und so ein resultat erreiche ich auch einfacher. Indem ich folgendes mache:

class UnhandledException
    {
        public static void AddHandler()
        {
            System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionHandler;
        }
        private static void UnhandledExceptionHandler(System.Object sender, UnhandledExceptionEventArgs args)
        {
            H.uerr.WriteError((Exception)args.ExceptionObject, "Nothing");
            if (!System.Diagnostics.Debugger.IsAttached)
                System.Diagnostics.Process.GetCurrentProcess().Kill();
        }
    }

Also gibt es nichts um Exceptions zu notieren und anschließend einfach aufzufangen ohne, dass diese geschmissen werden?

1.820 Beiträge seit 2005
vor 12 Jahren

Hallo!

Also gibt es nichts um Exceptions zu notieren und anschließend einfach aufzufangen ohne, dass diese geschmissen werden?

Nur, wenn um jede mögliche Exception-Quelle ein try-catch gespannt wird.
Alternativ kannst du einen try-catch um den Aufruf der MainForm in der Main-Methode spannen. Dann wird zwar abschließend dein Programm beendet, du hast aber vorher die Möglichkeit, den Benutzer zu informieren und die Meldung zu loggen. Dann weist du zumindest ungefähr, wo was schief gelaufen ist.

Nobody is perfect. I'm sad, i'm not nobody 🙁

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo tom-essen,

Alternativ kannst du einen try-catch um den Aufruf der MainForm in der Main-Methode spannen.

das fängt allerdings nur die Exceptions des Main-Threads. Man muss also zusätzlich noch in allen ThreadStart-Methoden ein try-catch einbauen und das geht natürlich nur für Threads die man selbst kontrolliert. Erzeugt irgendeine Klasse selbst einen Thread, bekommt man dessen Exceptions wieder nicht.

Nur, wenn um jede mögliche Exception-Quelle ein try-catch gespannt wird.

Was man aber natürlich mit AOP hinbekommen würde - um den Preis einer signifikanten Aufblähung des IL- oder Objectcodes. Ob PostSharp das injizieren von Code um jede einzelne Anweisung herum unterstützt, weiß ich allerdings nicht. Zumindest kann man Code am Anfang und am Ende einer Methode hinzufügen, was aber nicht unbedingt reicht.

herbivore

916 Beiträge seit 2008
vor 12 Jahren

Nun macht das aber auch nicht das was ich will. Weil wenn ich jetzt auch das...

Das ist nicht richtig, wenn du dich besser in die Materie eingearbeitet hättest dann hättest du dir das MethodExecutionArgs mal richtig angeschaut.

Dort gibt es eine Property FlowBehavior.


public override void OnException(MethodExecutionArgs eventArgs)
{
    Console.WriteLine(
            string.Format("=> Exception {1}.{2}{0}Message: {3}{0}StackTrace:{4}{0}", Environment.NewLine, eventArgs.Method.DeclaringType.Name, eventArgs.Method.Name, eventArgs.Exception.Message, eventArgs.Exception.StackTrace));
    eventArgs.FlowBehavior = FlowBehavior.Continue;
}

grüße freak

Again what learned...

1.820 Beiträge seit 2005
vor 12 Jahren

Hallo!

das fängt allerdings nur die Exceptions des Main-Threads

OK, das stimmt natürlich.
Aber es müsste für die aktuelle Domain auch ein UnhandledException-Ereignis geben, welches diese Fälle abdeckt, bin mir aber nicht ganz sicher.

Nobody is perfect. I'm sad, i'm not nobody 🙁