Geschrieben von: Christian Koller
Kategorie: ASP Tricks
This printed page brought to you by AlphaSierraPapa
Wenn man seine Seiten mit JavaScript oder DHTML aufpoliert, so kann man nie ganz sicher sein, daß es nicht doch einen bestimmten Browser oder eine Version in irgendeiner Sprache gibt, die auf die Seite allergisch reagiert sowie unschöne und nicht gerade imagefördernde Fehlermeldungen produziert.
Um dies zu vermeiden gibt es 2 Möglichkeiten:
Gegen Punkt 1 spricht wohl, daß es sich niemand leisten kann, in eine Seite für deren Entwicklung er eine Stunde gebraucht hat, etwa 100 Teststunden zu investieren und außerdem eine hübsche Anzahl von Rechnern mit unterschiedlichen Betriebssystemen zu besitzen und zu warten. (*)
Gegen Punkt 2 spricht eigentlich nur, daß möglicherweise die Erfahrung oder das Wissen fehlt um die nötigen Scripts zu erstellen. Dies ist der Punkt wo ich einhaken möchte.
Um einen Fehler in einer JavaScript- oder DHTML-Seite aufzufangen, benötigt man ein client-seitiges Script, das diese Aufgabe übernimmt. Weiters sollte dieses Script Daten über den Fehler, den verwendeten Browser und das Betriebssystem dem Webmaster zur Verfügung stellen. Optimal würde dies auf eine Art und Weise geschehen, daß der Betrachter der Seite möglichst keine Notiz von dem Fehler nimmt. Das folgende Script der JavaScript Funktion mit dem Namen "ErrorFunction" übernimmt diese Aufgabe weitgehend. Es fängt einen etwaigen JavaScript Fehler auf, sammelt Daten über diesen und leitet diese Daten im "Query String" an ein server-seitiges ASP Script weiter.
<HTML> <HEAD> <TITLE>JavaScript Error</TITLE> <SCRIPT LANGUAGE="JavaScript"> <!-- // Fehler abfangen in Internet Explorer und kompatiblen window.onerror=ErrorFunction; // // Fehler abfangen in Netscape und kompatiblen window.onError=ErrorFunction; function ErrorFunction(msg, url, line) { var hr; // URL der augenblicklichen Seite var appcode; // Codename des Browsers var app; // Programmname des Browsers var ver; // Betriebssystem und Version des Browsers var usr; // Programmheader in HTTP var wl; // URL und Query String des serverseitigen Scripts // das den Fehler weiterverarbeitet var qs; // Query String der beim Aufruf dieser Seite benutzt wird // Hier die URL des server-seitigen Scripts eintragen errorurl='http://194.8.136.198/silent/errorserversilent.asp'; // Die URL der augenblicklichen Seite speichern hr=window.location.href; qs=window.location.search; if (qs.indexOf('JsError=return')==-1) { appcode=navigator.appCodeName; app=navigator.appName; ver=navigator.appVersion; usr=navigator.userAgent; wl=errorurl+"?JsErrorUrl="+escape(url); wl+="&JsErrorLine="+escape(line); wl+="&JsErrorMsg="+escape(msg); wl+="&JsErrorAppcode="+escape(appcode); wl+="&JsErrorApp="+escape(app); wl+="&JsErrorVer="+escape(ver); wl+="&JsErrorUsr="+escape(usr); window.location=wl; } return true; } //--> </SCRIPT> </HEAD> <BODY> <BR><BR> <H3><CENTER>Hier zuerst mal eine ganz normale Webseite, bis plötzlich ...<BR><BR></CENTER></H3> <SCRIPT LANGUAGE="JavaScript"> <!-- // hier kommt der Fehler self=null; //--> </SCRIPT> <BR><BR> <H3><CENTER>... die Fehlermeldung wurde gesendet, der Benutzer hat (hoffentlich) nichts gemerkt.</CENTER></H3> <BR> </BODY> </HTML>
Was macht die JavaScript Funktion ErrorFunction? Sie fängt erst einmal dank der Befehle
window.onerror=ErrorFunction; window.onError=ErrorFunction;den JavaScript Fehler ab und verhindert somit das Erscheinen einer Fehlermeldung. Weiters sammelt es Daten über den Browser, die aufgerufene Seite, das Betriebssystem und Werte, die nach einem Fragezeichen an die URL angehängt worden sind (=Query String).
Es benutzt die Eigenschaft location des JavaScript Objektes window um das server-seitige ASP Script aufzurufen und die gesammelten Daten sowie die URL der augenblicklichen Seite an das serverseitige Script zu übergeben. Dort können die Daten dann gespeichert, ausgewertet und weitergeleitet werden. Das server-seitige Script hat weiters die Aufgabe die alte Seite wieder darzustellen, damit der Benutzer das sieht, was er eigentlich aufgerufen hat.
<% @ Language=VBScript %> <% Response.Expires=0 Response.AddHeader "Pragma","no-cache" Response.AddHeader "cache-control", "no-store" strM="" strM=strM & "URL = " & Request.QueryString("JsErrorUrl") & VbCrLf strM=strM & "Zeile = " & Request.QueryString("JsErrorLine") & VbCrLf strM=strM & "Fehlermeldung = " & Request.QueryString("JsErrorMsg") & VbCrLf strM=strM & "Codename des Browsers = " & Request.QueryString("JsErrorAppcode") & VbCrLf strM=strM & "Programmname des Browsers = " & Request.QueryString("JsErrorApp") & VbCrLf strM=strM & "Browserversion = " & Request.QueryString("JsErrorVer") & VbCrLf strM=strM & "Browserheader = " & Request.QueryString("JsErrorUsr") & VbCrLf strM=strM & "IP Adresse des Browsers = " & Request.ServerVariables("REMOTE_ADDR") & VbCrLf strM=strM & "Server Alias des Browsers = " & Request.ServerVariables("REMOTE_HOST") & VbCrLf ' ### Verarbeiten der gewonnenen Daten ueber den Fehler, ' ### die in strM gespeichert sind ' ### Man kann die Daten in einer Datenbank oder einer Datei speichern, ' ### oder sie ueber Email an den Webmaster schicken. ' Response.Write Replace(strM,vbcrlf,"<BR>" & vbcrlf) ' ### In diesem Beispiel wird von jedem Fehler mittels ' ### einer Mailkomponente ein Mail an den Webmaster geschickt On Error Resume Next Set objMail = Server.CreateObject("CDONTS.NewMail") strEmpfaenger = "ChristianK@softwing.com" strBetreff = "Javascript-Fehlermeldung von " strBetreff = strBetreff & Request.ServerVariables("SCRIPT_NAME") strNachricht = strM objMail.Send "",strEmpfaenger,strBetreff,strNachricht, 0 ' ### Hier erfolgt der Redirekt zurueck zur Seite, ' ### die den Fehler verursacht hat. strUrl=Request.QueryString("JsErrorUrl") If Instr(strUrl,"?") = 0 Then strRedirect = strURL & "?JsError=return" Else strRedirect = strURL & "&JsError=return" End If Response.Redirect(strRedirect) %>
Das ASP Script besteht aus drei Teilen:
Einen Nachteil dieser Lösung möchte ich nicht verschweigen. Es wird nur der erste Fehler auch an den Webmaster gesendet, alle weiteren Fehler werden zwar abgefangen, aber nicht mehr an des server-seitige Script zur Bearbeitung weitergeleitet.
Nun zur Frage, die sich dem aufmerksamen Leser vielleicht schon die ganze Zeit aufdrängt. Was haben client-seitige Fehler in einem Artikel im deutschen ASP Forum zu suchen? Man sollte sich auch mit den Dingen beschäftigen die das eigene Fachgebiet tangieren um zumindest eine Ahnung davon zu haben, wie die einzelnen Technologien sinnvoll zusammen eingesetzt werden können.
(*) Verschiedenen Parameter der Testszenarien sind unter anderem:
This printed page brought to you by AlphaSierraPapa
Debuggen von ASP Skripts - Teil 1
http:/www.aspheute.com/artikel/20000818.htm
Redirects mit Frame-Targets
http:/www.aspheute.com/artikel/20010530.htm
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.