Autor Beitrag
Ben4123
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Fr 10.01.14 15:44 
Hallo Leute,

Sitze mal wieder an meinem Programm aber hab ein mächtiges Freitagsbrett vorm Kopf.

Ich möchte die exceptions bei Events, bei denen Fehler auftreten können, mit try and catch Blöcke auslesen und in einer logfile speichern. Damit die User später mal nicht mir Errors vollgemüllt werden, sondern des ganz diskret im Hintergrund abläuft.

Für Wartungen kann ich das Logfile dann heranziehen

Habe es nach dem Vorbild versucht zu machen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
// i.e When the user clicks on a button
try
{
   LogFile = new LogFile("C:\\temp\temp1\auditlog.txt");
    ...
}
catch(Exception ex)
{
    ex.Log(ex); // Log exception
    // ex.Log(ex); // Log exception
}

leider jedoch bis jetzt ohne erfolg.

Würde mich sehr über Tipps und Anregungen freuen ich glaube sogar, dass es relativ einfach geht aber habe grad echt bissl ne Blockade :(

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 10.01.14 16:08 
Woher hat die Exception eine Log Methode? Und wieso muß man der eine Exception übergeben wenn es bereits die Methode einer Exception ist (oder besser wäre)?

Wenn du ein Objekt zum schreiben des Logfiles benutzen willst dann erzeuge es da wo du es brauchst also erst im Exception Block und zwar so das es selbst keine Exceptions werfen kann. So wie du das jetzt machst könnte schon das erzeugen von Logfile knallen du versuchst es aber im Exception Block zu benutzen. Da es geknallt hat wird es aber ungültig sein und vermutlich im Exception Block eine eigene Exception auslösen.

Deine Klasse zum Loggen solltest du eher so schreiben das die die nicht ständig erzeugen muß sondern entweder static oder als Singleton so das man einfach nur die Methode zum loggen aufrufen kann ohne jedesmal erst die Klasse vorzubereiten.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 10.01.14 16:17 
Hallo,

schreib dir eine statische Methode, welches das Logging(*) übernimmt und rufe diese dann von dem catch-Block auf, z.B.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
try
{
  // ...
}
catch(Exception ex)
{
  Logger.Log(ex);
}

Wenn du alle Exceptions abfangen möchtest, dann fange in deiner Main-Methode alle Exceptions (außerdem noch das Ereignis Application.ThreadException für andere Threads) und logge dort dann die Exception. Danach wird dann aber das Programm beendet.

Es ist keine gute Idee, einfach nur Exceptions zu fangen, ohne sie zu behandeln (auch ein Logging ist keine Behandlung)! Wenn das Programm durch einen Programmierfehler in einen ungültigen Zustand gekommen ist, dann das Programm mit evtl. einer für den Anwender verständlichen Fehlerbeschreibung beenden.
Nichts ist schlimmer, als z.B. bei einem Klick des Benutzer auf den Save-Button, einfach nur die Exception zu fangen und still weiterzuarbeiten. Der Benutzer denkt dann ja "ok, alles in Ordnung" und arbeitet dann weiter und weiter und speichert und speichert und am Ende hat er gar nichts!

(*) Für das Logging in eine Datei dann aber den "Append"-Modus aktivieren oder aber Dateinamen mittels Zeitstempel versehen.

Für diesen Beitrag haben gedankt: Ben4123
Ben4123 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Fr 10.01.14 16:45 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
   
public partial class SAT : Form
    {
                                                           // dt = Tabelle mit OU dt1 = tabelle mit User
        String path = "C:\\temp\\temp1\\auditlog.txt";
.
.
.
.
   private void BtnQuerry_Click(object sender, EventArgs e)                            //Aktion beim Klicken von Start Query
        {
            string p = "c:\\temp\\datei.txt";     // zum testen einen kleinen fehler erzeugt: textdatei mit dem text 10.01.2014 15:36:10: Could               not find file 'c:\temp\datei.txt'.
try
            {
                System.IO.StreamReader sr = new System.IO.StreamReader(p);
                int i = sr.Read();
            }

      catch(Exception exception)
            {
                System.IO.StreamWriter sw = new System.IO.StreamWriter(path);
                sw.WriteLine(DateTime.Now + ":" + " " + exception.Message);
                sw.Close();
            }


habs jetzt mal so gemacht
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Fr 10.01.14 20:24 
Du solltest es, wie Ralf gesagt hat, statisch oder nach dem Singleton-Pattern (das bevorzuge ich meist) in einer extra Klasse auslagern.

Dort tust du dann das, was du im catch-Block machst und sorgst dafür, dass nach Möglichkeit kein Fehler auftreten kann.
Es bietet sich z.B. an, irgendwo im AppData-Ordner, wo das Programm keine Admin-Rechte braucht, eine Datei zu erstellen, wo du dann immer rein schreiben kannst.

Du öffnest dann die Datei als Stream und schreibst immer rein. Vergiss aber das Schließen vom Stream nicht.
Da kann man die Datei glaube auch für den aktuellen Prozess sperren lasse, dass sie nicht verändert oder gelöscht und eine Exception geworfen wird.

Für diesen Beitrag haben gedankt: Ben4123