In PHP ist ja so ziemlich alles erforscht, wie man mit Exceptions und Errors umzugehen hat. In Javascript wird das Thema aber sehr stiefmütterlich behandelt. Hier mal ein Ansatz, um JS-Fehler effektiv tracken und loggen zu können.
E.js
var E = { //true: errors via alert / false: errors are being logged debugMode:false, //processes errors handle: function(sev,msg) { if (E.debugMode) { alert("Error ("+sev+") with message: " + msg); } else { var img=new Image(); img.src="errorlogger.php?sev="+encodeURIComponent(sev)+ "&msg="+encodeURIComponent(msg)+ "&url="+encodeURIComponent(document.URL); } } } //error has not been caught and forwarded to "errorhandler" manually -> windowerror window.onerror=function(msg,url,line) { E.handle(1,'Uncaught error:'+msg+" in "+url+", line "+line); return true; //continue }
In dieser Javascript-Datei geht die eigentliche Magie ab. Mittels des debugMode wird bestimmt, ob der Fehler ausgegeben oder geloggt wird. Im „Log“-Fall wird ein Image erzeugt (was natürlich nicht sichtbar ist), das die URL der Errorlog-Datei hat. Sollte ein Fehler auftreten (window.error), so wird dieser an den Errorhandler weitergereicht.
errorlogger.php
<?php error_log(date("d.m.Y H:i:s")." (JS) -> ".$_GET['msg']." (Severity: ".$_GET['sev']."): ".$_GET['url']."\n",3,"error.log"); ?>
Ultrasimpel. Die übergebenen Log-Parameter werden per error_log an eine Datei error.log appended. Wichtig: Per htaccess / httpd.conf den Aufruf der errorlog-Datei per Web verbieten.
Einbindung im HTML
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <script src="e.js"></script> <script> function divide(d1,d2) { if (d2==0) { throw new Error("Div by 0 is illegal."); } return d1/d2; } try { divide(3,0); } catch (ex) { E.handle(1,ex); } //does not exist -> window.error xyz(); </script> </head> <body> </body> </html>
So könnte das dann aussehen. in der divide-Funktion wird ein Error geworfen, der dann im try/catch Block aufgefangen und an den Errorhandler weitergegeben wird. Beim Aufruf von xyz() springt die window.onerror Funktion ein und bringt darüber auch wieder den Errorhandler ins Spiel.
Die Errorlog-Datei sieht nach Aufruf des obigen HTMLs im Browser dann so aus: