Sie sind hier : sebastian1012.bplaced.net/ homepage-neu / Themen-Blog1 / javascript-error-handling.php

Javascript Error-Handling

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:

js-errorlog

js-errorlog