{"id":117,"date":"2010-10-21T15:04:52","date_gmt":"2010-10-21T13:04:52","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=117"},"modified":"2010-11-26T23:16:27","modified_gmt":"2010-11-26T22:16:27","slug":"javascript-error-handling","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/javascript-error-handling\/","title":{"rendered":"Javascript Error-Handling"},"content":{"rendered":"<p>In PHP ist ja so ziemlich alles erforscht, wie man mit Exceptions und Errors umzugehen hat. In Javascript wird das Thema aber sehr stiefm\u00fctterlich behandelt. Hier mal ein Ansatz, um JS-Fehler effektiv tracken und loggen zu k\u00f6nnen.<\/p>\n<h3>E.js<\/h3>\n<pre data-enlighter-language=\"js\" class=\"EnlighterJSRAW\">\r\nvar E =\r\n{\r\n    \/\/true: errors via alert \/ false: errors are being logged\r\n    debugMode:false,\r\n\r\n    \/\/processes errors\r\n    handle: function(sev,msg)\r\n    {\r\n        if (E.debugMode) {\r\n            alert(&quot;Error (&quot;+sev+&quot;) with message: &quot; + msg);\r\n        } else {\r\n            var img=new Image();\r\n            img.src=&quot;errorlogger.php?sev=&quot;+encodeURIComponent(sev)+\r\n                         &quot;&amp;msg=&quot;+encodeURIComponent(msg)+\r\n                         &quot;&amp;url=&quot;+encodeURIComponent(document.URL);\r\n        }\r\n    }\r\n}\r\n\r\n\/\/error has not been caught and forwarded to &quot;errorhandler&quot; manually -&gt; windowerror\r\nwindow.onerror=function(msg,url,line)\r\n{\r\n    E.handle(1,&#039;Uncaught error:&#039;+msg+&quot; in &quot;+url+&quot;, line &quot;+line);\r\n    return true; \/\/continue\r\n}\r\n<\/pre>\n<p>In dieser Javascript-Datei geht die eigentliche Magie ab. Mittels des debugMode wird bestimmt, ob der Fehler ausgegeben oder geloggt wird. Im &#8222;Log&#8220;-Fall wird ein Image erzeugt (was nat\u00fcrlich nicht sichtbar ist), das die URL der Errorlog-Datei hat. Sollte ein Fehler auftreten (<em>window.error<\/em>), so wird dieser an den Errorhandler weitergereicht.<\/p>\n<h3>errorlogger.php<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n&lt;?php\r\n\terror_log(date(&quot;d.m.Y H:i:s&quot;).&quot; (JS) -&gt; &quot;.$_GET[&#039;msg&#039;].&quot; (Severity: &quot;.$_GET[&#039;sev&#039;].&quot;): &quot;.$_GET[&#039;url&#039;].&quot;\\n&quot;,3,&quot;error.log&quot;);\r\n?&gt;\r\n<\/pre>\n<p>Ultrasimpel. Die \u00fcbergebenen Log-Parameter werden per <a href=\"http:\/\/php.net\/manual\/de\/function.error-log.php\">error_log<\/a> an eine Datei error.log appended. <b>Wichtig:<\/b> Per htaccess \/ httpd.conf den Aufruf der errorlog-Datei per Web verbieten.<\/p>\n<h3>Einbindung im HTML<\/h3>\n<pre data-enlighter-language=\"html\" class=\"EnlighterJSRAW\">\r\n&lt;!DOCTYPE html&gt;\r\n&lt;html&gt;\r\n\t&lt;head&gt;\r\n\t\t&lt;meta charset=&quot;UTF-8&quot; \/&gt;\r\n\t\t&lt;script src=&quot;e.js&quot;&gt;&lt;\/script&gt;\r\n        &lt;script&gt;\r\n        function divide(d1,d2) {\r\n            if (d2==0) { \r\n               throw new Error(&quot;Div by 0 is illegal.&quot;);\r\n            }\r\n            return d1\/d2;\r\n        }\r\n\r\n        try {\r\n            divide(3,0);\r\n        } catch (ex) {\r\n            E.handle(1,ex);\r\n        }\r\n\r\n        \/\/does not exist -&gt; window.error\r\n        xyz();\r\n\t&lt;\/script&gt;\r\n\t&lt;\/head&gt;\r\n\t&lt;body&gt;\r\n\r\n\t&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>So k\u00f6nnte 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 <em>xyz()<\/em> springt die <em>window.onerror<\/em> Funktion ein und bringt dar\u00fcber auch wieder den Errorhandler ins Spiel.<\/p>\n<p>Die Errorlog-Datei sieht nach Aufruf des obigen HTMLs im Browser dann so aus:<br \/>\n<div id=\"attachment_134\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/js-errorlog.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-134\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/js-errorlog-300x44.jpg\" alt=\"js-errorlog\" title=\"js-errorlog\" width=\"300\" height=\"44\" class=\"size-medium wp-image-134\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/js-errorlog-300x44.jpg 300w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/js-errorlog-1024x151.jpg 1024w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/js-errorlog.jpg 1546w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-134\" class=\"wp-caption-text\">js-errorlog<\/p><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In PHP ist ja so ziemlich alles erforscht, wie man mit Exceptions und Errors umzugehen hat. In Javascript wird das Thema aber sehr stiefm\u00fctterlich behandelt. Hier mal ein Ansatz, um JS-Fehler effektiv tracken und loggen zu k\u00f6nnen. E.js var E &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/javascript-error-handling\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,8,3],"tags":[],"class_list":["post-117","post","type-post","status-publish","format-standard","hentry","category-javascript","category-quicktips","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/117","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=117"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/117\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=117"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=117"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=117"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}