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

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

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

Geschrieben von: Christian Koller
Kategorie: ASP Tricks

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:

  • Browser Internet Explorer( IE) , Netscape (NN), AOL, ...
  • Versionen IE 3, IE 4(diverse Versionen) , IE 5.0 (div. Vers.) , NN 2, NN 3 (div. Vers.), NN 4 (div. Vers.), ...
  • Sprachen Deutsch, Englisch, Französisch, Italienisch, ....
  • Betriebssysteme Windows 95, Win 95a, Win 95 OSR2, Win98, Win 98 SE, Win CE, Win NT Workstation 4.0, Win NT Server 4.0, Windows 2000, OS/2, UNIX, Linux, Solaris, Mac OS 8.5, ...
  • Service Packs Allein für Win NT 4.0 gibt es bereits 5 Service Packs
  • Hardware zum Beispiel CPU: Intel, Alpha, MIPS, Motorola, ...

Verwandte Artikel

Debuggen von ASP Skripts - Teil 1
Redirects mit Frame-Targets

Wenn Sie jetzt Fragen haben...

Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

 

Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©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.