Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Klasse bzw. Möglichkeit zum globalen Abfangen von exceptions?
thefiloe
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

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

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
xxxprod
myCSharp.de - Experte

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1.378
Herkunft: Österreich\Wien

beantworten | zitieren | melden

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

Lg, XXX
private Nachricht | Beiträge des Benutzers
thefiloe
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

beantworten | zitieren | melden

ok werd ich mal googeln. Danke
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
thefiloe
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
xxxprod
myCSharp.de - Experte

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1.378
Herkunft: Österreich\Wien

beantworten | zitieren | melden

Zum Beispiel nach "PostSharp Logging".

2. Treffer sieht schon sehr brauchbar aus: Link

Lg, XXX
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
thefiloe
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

beantworten | zitieren | melden

@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.
private Nachricht | Beiträge des Benutzers
thefiloe
myCSharp.de - Member



Dabei seit:
Beiträge: 87

Themenstarter:

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1.815
Herkunft: NRW

beantworten | zitieren | melden

Hallo!
Zitat von thefiloe
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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo tom-essen,
Zitat
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.
Zitat
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
private Nachricht | Beiträge des Benutzers
rollerfreak2
myCSharp.de - Member

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 916

beantworten | zitieren | melden

Zitat
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...
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1.815
Herkunft: NRW

beantworten | zitieren | melden

Hallo!
Zitat von herbivore
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
private Nachricht | Beiträge des Benutzers