Einzelnen Beitrag anzeigen

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