AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Konzeptfrage: abgeleitete Exception-Klasse, die automatisch loggt
Thema durchsuchen
Ansicht
Themen-Optionen

Konzeptfrage: abgeleitete Exception-Klasse, die automatisch loggt

Ein Thema von s.h.a.r.k · begonnen am 9. Dez 2010 · letzter Beitrag vom 4. Jan 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Konzeptfrage: abgeleitete Exception-Klasse, die automatisch loggt

  Alt 9. Dez 2010, 17:22
Hallo zusammen,

hatte mir mal vor längerer Zeit Gedanken darüber gemacht, wie man denn am besten Exceptions loggen kann (neben anderen Meldungen). Die Grundidee war dabei, dass ich eigentlich alle Fehlermeldungen unbedingt geloggt haben will, wobei dies ja sehr stark mit Exceptions verknüpft ist.

Vorab muss ich noch sagen, dass ich einen LogController habe, der nach dem Singleton-Pattern gebaut und global verfügbar ist. Somit kann ich via LogController.Log() von überall aus eine Log-Zeile schreiben -- vorausgesetzt das loggen selbst schlägt nicht fehl. Diese Möglichkeit will ich bei meinen weiteren Betrachtungen außer Acht lassen.

Was haltet ihr davon eine Kindklasse von Exception zu erzeugen, die sich selbst loggt, d.h. wenn ich raise Exception.Create('Blub') aufrufe, wird in der Create-Methode der LogController aufgerufen, der dann die Nachricht samt Typ der Exception loggt. Dies ist natürlich der einfachste Fall, es können auch mehrere Informationen geloggt werden, da die Create-Methode überschrieben werden kann.

Nun eure Meinungen zu dieser Idee?!
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Neumann

Registriert seit: 6. Feb 2006
Ort: Moers
536 Beiträge
 
Delphi 12 Athens
 
#2

AW: Konzeptfrage: abgeleitete Exception-Klasse, die automatisch loggt

  Alt 9. Dez 2010, 18:37
Die Idee finde ich gut. Man müsste wohl direkt die von Delphi mitgelieferte Exception-Klasse modifizieren; ich wüsste nicht wie eine davon abgeleitete Klasse funktionieren könnte.

Zur Zeit mache ich es so, das in jedem relevanten Except-Block ein Routine aufgerufen wird, die die e.Message, Datum und Zeit und ev. noch weiteres in die Log-Datei schreibt; z.B. den verursachenden SQL-Code bei Exceptions die mit Datenbankzugriffen zu tun haben usw.

Nicht lokal abgefangene Exceptions landen dann in einer Routine für AppException, von dort wird auch wieder in den Log geschrieben.

Gruß

Ralf
Ralf
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: Konzeptfrage: abgeleitete Exception-Klasse, die automatisch loggt

  Alt 9. Dez 2010, 19:43
Hm, das mit den schon bestehenden Exceptions habe ich leider leicht übersehen, da ich einige eigene verwende Somit würde des System ziemlich inkonsequent werden, wenn bei der einen Exception ein zusätzlicher Log-Aufruf nötig ist und bei der eigenen Klasse das eben automatisch passiert. Vor allem für andere Programmmierer, die das lesen, wäre es unzumutbar imho. Das Leben hätte so schön sein können *grml* Aber vielleicht fällt einem ja eine Lösung für dieses Problem ein?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#4

AW: Konzeptfrage: abgeleitete Exception-Klasse, die automatisch loggt

  Alt 9. Dez 2010, 19:53
Moin zusammen,

habe da doch schon mal was gesehen. Mal ganz tief in die "Wühlkiste" greif...
Uhps meine abgeleiteten TQueries zur Seite schieb... tja noch ein Parser ...
....van Genuchten Formeln... Tree mit xml export... Cobian Backup... aha ..

joop das isses doch: http://blog.gurock.com/postings/work...tacktrace/730/

Grüße
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: Konzeptfrage: abgeleitete Exception-Klasse, die automatisch loggt

  Alt 9. Dez 2010, 20:49
Bin gerade mal grob drüber geflogen und schaut sehr viel versprechend aus. Mir ist gerade auch gekommen, dass man eine globale Callback-Methode definieren kann, die bei JEDER Exception aufgerufen wird, soweit ich weiß. Ich finde die Quelle allerdings nicht mehr...

-- EDIT: Hab mir da glaub scheinbar etwas geirrt. Meinte Application.OnException bzw. HandleException. Problem hierbei:
Zitat von Delphi-Hilfe:
Wird ausgelöst, wenn in der Anwendung eine unbehandelte Exception auftritt.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k ( 9. Dez 2010 um 21:01 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#6

AW: Konzeptfrage: abgeleitete Exception-Klasse, die automatisch loggt

  Alt 9. Dez 2010, 21:15
Ich finde die Idee vom Grundgedanken her sehr gut. Nur sehe ich da einiges an Problemen. Ich muss selber im Quelltext aufpassen,wo könnte eine Exception auftreten. Damit könnte der Quelltext aus lauter Exception.Create oder try..except-Blöcke bestehen, was aus meiner Sicht den Quelltext ziemlich unübersichtlich macht.

Ich benutze das Tool Eurekalog. Dieses logt mir den Fehler und wo der Fehler im Quelltext aufgetaucht ist. Das Geld für das Tool Eurekalog hat sich bis heute schon mehr als einmal bezahlt gemacht. Dort gibt es ziemlich viele Einstellungen, wie und was mit einer Exception-Meldung passieren soll.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#7

AW: Konzeptfrage: abgeleitete Exception-Klasse, die automatisch loggt

  Alt 9. Dez 2010, 21:26
Solche Tools werden wohl auf den selben Ideen basieren, imho, nur halt wesentlich ausgereifter sein. Der von mschaefer genannte Artikel ist hier sehr schön zu lesen. Müsste mich echt mal durch diese Tools durcharbeiten -- Problem dabei ist aber immer, dass es meist recht viele gibt und man beim Testen unendlich viel Zeit verschwenden kann. Bin aber auch gerne daran interessiert, welches Tool, denn meine Idee schon komplett implementiert hat
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#8

AW: Konzeptfrage: abgeleitete Exception-Klasse, die automatisch loggt

  Alt 9. Dez 2010, 21:42
Moin,

ich kann leider nichts aus der Delphi-Ecke beitragen, aber in der PHP-Entwicklung hat man ja dasselbe Problem.

Prinzipiell geht es bei uns (auf Arbeit) so dass wir erstmal das Observer pattern umgesetzt haben. Dazu haben wir eine Event-Dispatcher-Klasse, die wie folgt aufgerufen wird:
Event_Dispatcher::getInstance()->triggerEvent($eventName, $priority, $eventData)
Damit wird ein Event an die Queue $eventName geschickt - was das ist ist wirklich egal solange es als String repraesentiert werden kann (kann also auch ein Exception-Objekt sein).

Nun kann man noch ein Objekt an verschiedene Queues anhaengen:
Event_Dispatcher::getInstance()->attachHandler($eventNames, $handler)
$eventHandler muss lediglich ein bestimmtes Interface implementieren um die Message anzunehmen. Wir haben eine Logger-Klasse die die Events filtert (z.B. nach Prio) und irgendwohin schiebt (File-Log, Firebug-Log, sogar ein SMS-Interface koennte dahinter liegen)

Prinzipiell koennen wir also sowas machen:
PHP-Quellcode:
try {
    $this->foo();
} catch (SomeException $e) {
    $this->doSomethingToFixThisStuff();
    EventHandler::getInstance()->triggerEvent('myCoolEventQueue', Zend_Log::ERR, $e->getMessage());
    EventHandler::getInstance()->triggerEvent('myCoolEventQueue', Zend_Log::DEBUG, $e);
}
Zu Deutsch schicken wir eine Exception einmal mit der Prio "Error" an die Queue, danach schicken wir die komplette Message mit Prio "Debug" an die Queue - so macht das Debuggen dann mehr Spass. So koennen wir z.B. einen File-Logger auf die Fehlermeldungen ansetzen (v.a. im Live-Betrieb), im Dev-Betrieb auch einen Firebug-Logger (der macht das Ganze schnell im Browser verfuegbar) mit Prio "Debug" auf dieselbe Queue.

Nun koennten (darauf haben wir bisher verzichtet, schliesslich ist die obige Loesung sehr umfangreich) wir auch unsere Exception-Klasse (leitet von der Standard-PHP-Exception ab) so anpassen, dass sie im Konstruktor automatisch die Message an eine bestimmte Queue (z.B. dem Klassennamen der Exception) schicken, auch wieder mit der obigen Err/Debug-Spezifizierung.
Der Grund warum wir das nicht gemacht haben ist simpel: nicht jede Exception die geworfen wird muss geloggt werden (schliesslich behandelt man sowas ja auch). Andererseits reicht es auch nicht, nur unbehandelte Exceptions zu loggen. Man will ja schliesslich auch mal eine Exception abfangen um eine "schoene" Meldung anzuzeigen und den Fehler aber trotzdem loggen. So oder so muesste man also noch zusaetzlichen Aufwand betreiben um das gewuenschte Ergebnis zu erhalten. Deshalb wird lediglich das geloggt, was die Queue macht. Einzelne Komponenten haben natuerlich ihre eigenen Queues (z.B. werden im XML-RPC-Server automatisch alle Exceptions geloggt und nicht nach aussen gegeben), aber die Anwendungen die wir entwickeln schreiben nicht automatisch alle Exceptions mit.

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#9

AW: Konzeptfrage: abgeleitete Exception-Klasse, die automatisch loggt

  Alt 9. Dez 2010, 21:46
Prinzipiell steht dem nichts im Wege.
In einem größeren Projekt (allerdings in C#) haben wir auch eine 'AuditedException' die sich selber loggt.

Problematisch ist allerhöchstens, dass gewisse Fälle, in denen in einem try-catch block eben diese Exception sauber behandelt und entsprechend (richtig) korrekt fortgeführt wird, diese Exception dennoch geloggt wird, obwohl kein 'echter' Fehlerfall eingetreten ist.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#10

AW: Konzeptfrage: abgeleitete Exception-Klasse, die automatisch loggt

  Alt 9. Dez 2010, 21:54
Moin Sebastian,

wie macht ihr das? Werft ihr dann extra eine AuditedException? Wir haben es so dass alle Packages ihre eigenen Exceptions haben: z.B. nutzt Zend_XmlRpc_Server die Exception Zend_XmlRpc_Exception. In so einem Fall braeuchte man ja eine Zend_XmlRpc_Exception und eine Zend_XmlRpc_AuditedException, welche eben von Zend_AuditedException ableiten wuerde anstatt von Zend_Exception. Ist das bei euch auch so oder wie kann ich mir das vorstellen?

Zum Loggen: in PHP ist es so dass die Objekte irgendwann zerstoert werden. Die Exception koennte ja auch als unhandled markiert werden, im Catch-Block markiert man sie anschliessend mit ->handle() als handled. Im Destruktor schiebt man dann die Exception (siehe obige Erklaerung) noch auf eine Queue raus, sofern sie nicht gehandled wurde. Man muss dann zwar im Catch-Block noch ein $exception->handle() schreiben, aber das koennte das Problem ja beheben, oder?

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz