Fehler und deren Behandlung in REDAXO
Nach einigen Wochen unangenehmer Entwicklungsarbeit sind wir jetzt endlich bereit, unser neues AddOn für REDAXO zu veröffentlichen: der Error Handler.
Version 0
Vor circa einem halben Jahr begannen wir damit, Fehler nicht mehr nur vom Kunden finden zu lassen ;-) oder zu ignorieren, sondern sie kontrolliert zu behandeln. Im ersten Anlauf (eine kleine Hau-Ruck-Lösung, ich geb's ja zu) haben wir ein extra Script in REDAXO injiziert, das sich als Error Handler (set_error_handler) ins System gehängt hat und bei jedem Fehler (darin sind auch Warnungen und Hinweise eingeschlossen) eine eMail an uns schickte. Damit hatten wir einen durchaus brauchbaren Überblick über Fehler der Website, nachdem diese auf dem Server des Kunden gelandet ist. In der eMail waren neben IP, User-Agent, Zeitpunkt und weiteren statistischen Daten auch ein Stacktrace und der Inhalt der globalen $_GET, $_POST, $_COOKIE und $_SERVER enthalten. Ein Traum, wenn es an das Finden von Fehlern ging.
Vorteile
Das ganze brachte große Vorteile für alle, die am Projekt beteiligt waren:
Der Kunde muss uns nicht mehr Screenshots schicken, nur um festzustellen, dass der für uns interessante Teil fehlt. Er muss sich auch die Fehlermeldung nicht mehr merken oder sie extra in eine eMail an uns kopieren. Im Regelfall wissen wir bereits vor dem Kunden, dass es irgendwo geknallt hat.
Der Entwickler muss nicht mehr raten, wie der Fehler zustande kam. Er hat direkt einen Stacktrace und den globalen Systemzustand zur Hand und muss nicht traurig sein, dass der Kunde diese wertvollen Daten nicht (nach)liefern kann. Auch muss er den Kunden weniger oft bitten, zu beschreiben, was er getan hat, um den Fehler zu produzieren.
Zu guter Letzt freut sich auch der Vertrieb, wenn weniger Mails reinkommen, die als Bugs im internen Ticket-System eingetragen werden müssen. Immerhin gehen die eMails direkt an den oder die Entwickler. Und weil Fehler, die nicht korrigiert werden, den Entwickler auf Dauer nerven, werden sie auch schneller behoben - einfach nur, um Ruhe zu haben.
Version 1
So toll die eMails auch sind, so schlecht sind sie integriert. Ist das Script einmal eingebunden, werden alle Fehler abgefangen. Macht man lokal Fehler, versucht PHP, eMails zu verschicken - unter Windows schlägt das i.d.R. aufgrund des fehlenden SMTP-Servers fehl. Auch die Konfiguration war etwas hakelig und unschön.
Um das ganze Konzept etwas in geregelte Bahnen zu lenken, haben wir uns entschlossen, die Funktionalität als AddOn neu umzusetzen. Bevor ich das grobe Konzept beschreibe, möchte ich vorher noch rumheulen, wie schlimm das war einen kleinen Hinweis geben:
Error Handler für PHP zu schreiben ist wie Liebe: Wenn möglich, vermeiden!1
Warum ist das so? Nun, man schreibt Code, der Fehler behandeln soll. Dumm nur, wenn im eigenen Code auch Fehler stecken. Dann muss der fehlerhafte Code sich selbst abfangen und managen. Das kann ja nur schiefgehen. Man ist also ständig gezwungen, den Error Handler teilweise abzuschalten, um zu prüfen, wo etwas nicht stimmt. Gerade, wenn Fehler nicht angezeigt werden sollen, wird's echt lästig. Aber genug rumgeheult.
Funktionen
Das AddOn stellt zwei Umgebungen zur Verfügung: Produktion und Entwicklung. Beziehungsweise Production und Development auf Neudeutsch.
In der Produktiv-Umgebung werden Fehler keinesfalls angezeigt. Sie werden stattdessen auf dem Server protokolliert und - auf Wunsch - per eMail verschickt. Diese Umgebung wählen wir also, wenn der Code auf dem Server läuft und die Website bereits live ist.
In der Entwicklungs-Umgebung werden Fehler ebenfalls nicht mehr dort angezeigt, wo sie auftreten. Stattdessen werden sie gesammelt und inklusive Stacktrace und Code-Ausschnitt in einem HTML-Overlay angezeigt. Gleichzeitig werden auch SQL-Queries geloggt und in einem Overlay angezeigt (inklusive abgerufener Datensätze und dafür benötigter Zeit).
Im REDAXO-Backend kann man einfach zwischen diesen Umgebungen wählen und diese auch gleich konfigurieren.
Error-Level-Auswahl
Einstellungen im Production-Environment
Aufgetretene Fehler
Download
Wir sind zuversichtlich, mit diesem AddOn einen kleinen Beitrag zur Qualitätssicherung von Redaxo-Projekten zu leisten. Da der Error Handler nur einen Aufsatz auf REDAXO darstellt, kann man ihn einfach deaktivieren, falls er doch Probleme machen sollte (Ticket erstellen nicht vergessen!).
Das AddOn ist für REDAXO 4.1 und 4.2.x verfügbar und basiert auf unseren Developer Utils, die neben grundlegenden Funktionen auch das Backend von REDAXO leicht anpassen. Es wird unter MIT-Lizenz veröffentlicht. Für die Funktionalität im Frontend muss auf der Seite (zur Zeit) jQuery eingebunden sein (was bei uns bei allen Seiten der Fall ist).
Download des AddOns Error Handler v1.1.4 (ca. 360 KB, für REDAXO 4.1 bis 4.2.x)
Einen kleinen Schönheitsfehler hat die Sache jedoch: Um Zugriff auf die SQL-Queries zu haben, muss bei der Installation der Developer Utils die Klasse rex_sql gepatched werden. Wer dort keine Veränderungen vorgenommen hat, muss sich keine Gedanken machen. Andernfalls sollte man dringends davon absehen, die Developer Utils zu installieren, da sonst die eigenen Änderungen verlorengehen.
Quellcode
Neben dem eigentlichen Download für alle, die das AddOn einfach nur konsumieren möchten, sei an dieser Stelle auch noch auf das öffentliche Repository bei Bitbucket verwiesen. Wir freuen uns über Mithilfe und Feedback jeder Art. Sei es in Form von Patches oder via Forks. Einzige Voraussetzung ist ein installierter Mercurial-Client (für Windows: Mercurial Command Line, TortoiseHg, MercurialEclipse, Merclipse, ...). Feedback und Patches dann bitte direkt an mich (christuoph@weWbvariarnts.dei). Ich freu mich drauf :-)
(1) Hat jemand die "Per Anhalter durch die Galaxis"-Referenz erkannt? Irgendjemand?
Dieser Beitrag wurde von Christoph Mewes am 02. November 2009 verfasst.
Kategorien: Redaxo, Webentwicklung
Kommentare
1 Christoph am 23. Februar 2010 um 18:33
Stimmt, aber die Möglichkeiten von PHP4 sind einfach zu beschränkt, um derartige AddOns brauchbar umzusetzen.
2 Steffen am 23. Februar 2010 um 18:16
Ja das ist der Fall. Schade, sieht nach einem super Addon aus :(
3 Christoph am 23. Februar 2010 um 17:55
Das klingt, als würdest du versuchen, den Code in PHP4 laufen zu lassen. Das ist aber nicht möglich. Ohne PHP5 läuft da nichts.
4 Steffen am 23. Februar 2010 um 17:48
Bekomme bei der Installation der developer utilities folgenden fehler: Parse error: syntax error, unexpected T_STRING, expecting '{' in /homepages/11/d137478395/htdocs/v2/redaxo/include/addons/developer_utils/classes/class.sql.php on line 30 Benutze Redaxo 4.2.1
5 Christoph am 09. November 2009 um 00:04
Die Developer Utils sind ein AddOn, in dem wir allgemeine Funktionen wie eine SQL-Abtraktion oder Komfort-Funktionen für REDAXO mitliefern. Außerdem erzeugen wir mit den dort enthaltenen Klassen die Backend-Formulare (rex_form passte nicht auf unsere Anforderungen).
6 Stefan am 07. November 2009 um 15:12
Super, bin nur zufällig hierdrauf gestoßen - sowas habe ich immer schon gesucht. Momentan (also vor der Installation) wird mir noch nicht klar, was die Dev_Utils mit dem Err_Handler zu tun haben sollen - aber das werd ich schon noch rausfinden und notfalls nachfragen, wa? ;)
7 Christoph am 03. November 2009 um 13:29
Wie kommst du darauf, dass es eine Flut von eMails gibt? Solange man E_STRICT nicht aktiviert, ist REDAXO erstaunlich ruhig und sehr anständig. So wie unser Code. Ganz im Ernst: Das Script läuft bisher in 4 Projekten und von keinem kam in den letzten 2 Wochen auch nur eine einzige eMail. Und ja, auf den Websites sind auch Leute aktiv ;-) Mit den Mails umzugehen ist doch einfach: Opera M2 -> Filter "Error Mails" inkl. Subfilter pro Projekt. Da die Domain mit im Betreff steht, ist das kein Ding. Wobei man echt überlegen könnte, ob man die Mails nochmal filtert und bei einem entsprechenden Aufkommen dann Bugreports erstellt. Da die Fehlermeldung auch im Betreff steht, sollte sich das sehr leicht gruppieren lassen. Aber solange sich das eMail-Volumen in Grenzen hält, wäre das wohl over-engineered.
8 Gregor am 03. November 2009 um 13:23
Und wenn ihr mal jemanden ärgern wollt, nehmt ihr seine Mail-Adresse einfach in den Verteiler des Error Handlers auf.. ;-) Mal im ernst, wie geht ihr denn mit dieser Flut an E-Mails um (oder ist Redaxo inzwischen schon soweit Bugfrei)? Zuerstmal nehme ich an, dass dafür ein spezieller Mail-Account eingerichtet wurde, oder? Setzt ihr irgendwelche Tools ein, die den Umgang mit großen Mengen von Nachrichten erleichtern? Es bietet sich evtl. an, identische Fehlermeldungen zu gruppieren.