Entwickler-Ecke
WinForms - [VisualStudio12] Mit Try and catch die exceptions loggen
Ben4123 - Fr 10.01.14 15:44
Titel: [VisualStudio12] Mit Try and catch die exceptions loggen
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:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| try { LogFile = new LogFile("C:\\temp\temp1\auditlog.txt"); ... } catch(Exception ex) { ex.Log(ex); } |
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
Th69: C#-Tags hinzugefügt
Ralf Jansen - 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 - 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.
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.
Ben4123 - Fr 10.01.14 16:45
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 { String path = "C:\\temp\\temp1\\auditlog.txt"; . . . . private void BtnQuerry_Click(object sender, EventArgs e) { string p = "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 - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!