Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

JavaScript & DHTML - Wie man Fehler findet bevor die Kunden es tun

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:

  1. Man hält sich ein Archiv von unzähligen Browservarianten in allen möglichen und unmöglichen Sprachen und testet seine Seiten auf gebräuchlichen und weniger gebräuchlichen Betriebssystemen, Prozessoren und Service Packs, wobei allein der Hardwareaufwand für einen Entwickler fast unbezahlbar ist.
  2. Man überläßt es der HTML Seite selbst den JavaScript Fehler aufzufangen, die Fehlermeldung zu unterdrücken und eine möglichst genaue Fehlermeldung, vom Benutzer unbemerkt, zum Webmaster zu senden.

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&ouml;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:

  1. Auslesen der Daten (über den Browser, das Betriebssystem, die aufgerufene Seite) aus dem Query String und Erstellen der detailierten Fehlermeldung.
  2. Verarbeiten der Fehlermeldung. In diesem Beispiel wird sie über eine Mail-Komponente an den Webmaster geschickt.
  3. Erneutes Aufrufen der ursprüngliche Seite mit einem zusätzlichen Parameter, sodaß das client-seitige Script bei einem Fehler nicht wieder zum ASP Script springt, was unweigerlich in einer Endlosschleife enden würde.

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

Verwandte Artikel

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.