Error-Handler - Fatal Errors loggen?

Klein0r

Erfahrenes Mitglied
Hallo zusammen!

Ich hab mir eine eigene Funktion geschrieben die ich als Error-Handler nutze - via http://de2.php.net/set_error_handler

In dieser Funktion schreibe ich den aktuellen Fehler ins log des Servers und zusätzlich noch in mySQL. Funktioniert auch alles.

Aber sobald es zu einem Fatal Error kommt fehlen beide Einträge. Gibt es keine Möglichkeit diese Fehler mit der Methode auch zu loggen? Denn irgendwie ist es ein wenig blöde wenn ein Benutzer auf meiner Seite solch einen Fehler auslöst (sieht er zwar nicht - aber ich bekomme davon ja nichts mit und kann ihn nicht beheben). Also müsste ich alle meine Fehler selbst finden.

Ist zwar eher unwahrscheinlich das solch ein Fehler auftritt - aber sicherlich nicht ausgeschlossen.

Wie kann ich genau diese Fehler loggen?

lg
 
Nein leider nicht. Ein Fatal error bricht dein Script ab. D.h. die Errorhandler Funktion kann nicht mehr ausgeführt werden.
 
Aber die "normale" Fehlerbehandlung bekommt es doch auch hin den Fehler zu beschreiben und die Meldung auszugeben?!

Das muss doch irgendwie gehen :(

lg
 
Die "normale" Fehlerbehandlung ist auch eine Apache Funktion.
Mit dem Errorhandler fängst du ja auch nur die Daten dieser Funktion ab und verhinderst die Standard ausgabe um die Daten nachzubearbeiten und dann auszugeben.
Die Standard Funktion bearbeitet die Daten nicht Scriptseitig nach sondern gibt sie aus.
Ein Fatal Error bricht dein Script ab und das bleibt auch so das lässt sich nicht ändern!
Aber im Live Modus deines Scriptes kann i.d.R auch kein Fatal Error mehr vorkommen.
 
Gut - alles klar :) Dank dir!

Noch eine weitere Frage: Man kann Fehler mit einem @ vor dem Funktionsaufruf ja unterdrücken. Anscheinend ist das @ aber total egal wenn man einen eigenen Error-Handler definiert hat.

Nun die Frage: bekomme ich im Handler irgendwie raus ob die funktion mit einem @ gekennzeichnet wurde?
(Am besten ohne die Datei zu öffnen, zu der Zeile zu springen und zu prüfen ob in der Zeile ein @ enthalten ist ;) )

lg
 
Hi, also das mit dem @ hatte ich auch mal, das kannst du folgendermassen lösen:
PHP:
function handleError($type, $message, ...)
{
  if($type & error_reporting())
  {
    // Hier den Code zur Fehlerbehandlung rein
  }
}
Damit passt dann alles, die Sache mit den Fatal Errors und dem Server Log kann man auch lösen, und zwar musst du, glaub ich, folgendes irgendwo am Anfang des Scripts machen:
PHP:
ini_set('display_errors', false); // Damit die Fehlermeldungen nicht ausgegeben werden.
und dann in der Funktion, die du als Error Handler verwendest, am Ende ein
PHP:
return false;
verwendest. Allerdings tauchen dann die Fatal Errors nur im Server Error Log auf, die kannst du nicht noch extra in eine DB schreiben lassen, hoffe das hilft dir weiter.
 
Hey danke werde ich gleich mal testen. Aber ich glaube nicht das das etwas mit dem @ zu tun hat. Das unterdrückt doch nur im normalen Handler die Meldung.
Mit deinem Beispiel vergleichst du aber nur ob der aktuelle Fehler mit dem aktuellen error_reporting_level angezeigt werden soll. Das ist nen kleiner aber feiner
unterschied ;) Also ich glaube nicht das es funktionieren wird.

Immerhin habe ich auch error_reporting auf 0 gesetzt und daher werden generell alle Fehler unterdrückt (aber dennoch im eigenen Handler behandelt).

lg
 
Zuletzt bearbeitet:
Hi, du hast scheinbar keine Ahnung, was der @ Operator überhaupt macht, er unterdrückt nämlich die Fehlermeldung... und wie? Ganz einfach: Indem er temporär das "error_reporting" auf 0 setzt, und desshalb funktioniert diese Lösung eben doch, allerdings musst du in deinem Script error_reporting am Anfang auf E_ALL | E_STRICT oder was auch immer du haben willst setzen, da dir sonstt gar keine Fehler angezeigt werden
 
Achso und aus dem Grund nutzt du auch den ini_set und setzt nicht das error_reporting runter. Wieder was gelernt!

Teste das ganze dann später ;)

lg
 
Rrrrrichtig, und das mit dem "return false;" amd Ende der Error Handler Funktion hab ich vor einiger Zeit in den Kommentaren auf php.net gelesen, nämlich in diesem.

Allerdings hat die ganze Geschichte, wie mir selber im Lauf der Zeit aufgefallen ist, noch einen Haken, und zwar kann man ein paar Fehler nicht mit der eigenen Error Handler Funktion behandeln, man kann sie also auch nicht selber anzeigen, und muss sie mühsam im Error Log vom Server nachschauen, deswegen solltest du "display_errors" während du das Script weiterentwickelst auf "true" setzen, da es sonst umständlich wird, und dann für den Produktiveinsatz auf "false", da die Fehlerausgabe sonst ein dickes Sicherheitsrisiko darstellt.
 
Zurück