Geschrieben von: Christoph Wille
Kategorie: ASP Tricks
This printed page brought to you by AlphaSierraPapa
Mit IIS4 waren die Möglichkeiten der Fehlerbehandlung nur eingeschränkt vorhanden - entweder man ließ den Fehler geschehen, oder zeigte dem Benutzer eine kurze Textmeldung an (über die Einstellung Home Directory/Configuration/App Debugging) - und die dritte Variante war dann auch schon On Error Resume Next, um die Fehler gänzlich zu unterdrücken.
An eine zentrale Fehlerbehandlungsseite war nicht zu denken, da Fehler nicht von einer Seite zu einer anderen weitergereicht werden konnten - das VBScript Err Objekt konnte nicht einmal von Funktion zu Funktion weitergereicht werden.
Unter IIS5 gibt es jetzt die Möglichkeit, von ASP ausgelöste Fehler zentral in einer Datei abzuhandlen. Der Schlüssel dazu ist der HTTP Status Code 500.100, den man auf eine eigene Fehlerbehandlungsseite einmappen kann. Die Default Website hat bereits eine Fehlerbehandlungsseite: 500-100.asp, die im Verzeichnis %SystemRoot%\help\iishelp\common liegt. Alle anderen Websites haben standardmäßig nur das, was wir schon von IIS4 her kennen.
Um das zu ändern, muß man die Eigenschaften der Website anzeigen, und dann in den Tab Custom Errors wechseln:
Dort sucht man sich den 500.100 Fehler, und klickt auf Edit Properties.
Ich habe hier die Datei my500-100handler.asp eingegeben, die ich im Laufe dieses Artikels noch vorstellen werde (auch 500-100.asp von der Default Web Site kann verwendet werden). Wichtig ist, daß man als Message Type URL auswählt.
Wie kann man aber in einer ASP Datei auf den Fehler einer anderen zugreifen? Dies ermöglicht der Befehl Server.GetLastError, der ein ASPError Objekt zurückliefert (beide neu in IIS5), das den Fehler beschreibt:
Eigenschaft | Beschreibung |
---|---|
Category | Beschreibt die Fehlerquelle: ASP interner Fehler, Skriptsprache, oder externes Objekt |
Number | Liefert den Fehlercode als COM-Äquivalent (0x...) |
Description | Kurzbeschreibung des Fehlers |
Source | Falls verfügbar, liefert den Sourcecode der Zeile, die den Fehler verursacht hat |
File | Name der ASP Datei, die ausgeführt wurde, als der Fehler auftrat. Liefert "?" wenn kein Fehler im AspError Objekt gespeichert ist. |
Line | Zeile in der der Fehler ausgelöst wurde (0 bedeutet nicht verfügbar) |
Column | Spalte, in der der Fehler ausgelöst wurde (0 bedeutet nicht verfügbar) |
ASPCode | IIS-generierter Fehlercode ("" bedeutet nicht verfügbar) |
ASPDescription | Detaillierte Fehlerbeschreibung falls es ein ASP Fehler war ("" bedeutet nicht verfügbar) |
Um die Verwendung der jeweiligen Eigenschaften zu verdeutlichen, habe ich mit my500-100handler.asp ein sehr einfach (designmäßig als auch vom Funktionsumfang) gehaltenes Fehlerbehandlungsscript geschrieben:
<% ' den letzten Fehler abholen Set xObjLastError = Server.GetLastError() strASPErrorCode = xObjLastError.ASPCode nErrorNumber = xObjLastError.Number strErrorDescription = xObjLastError.Description strASPErrorDescription = xObjLastError.ASPDescription strErrorSource = xObjLastError.Source strCategory = xObjLastError.Category nLine = xObjLastError.Line nColumn = xObjLastError.Column strFilename = xObjLastError.File Response.Write strCategory & "'" & Hex(nErrorNumber) & "'<br>" Response.Write strErrorDescription & "<br>" If Len(strASPErrorCode) > 0 Then Response.Write "ASP Fehlercode: " & strASPErrorCode & "<br>" End If If Len(strASPErrorDescription) > 0 Then Response.Write "ASP Fehler, Beschreibung: " & _ strASPErrorDescription & "<br>" End If ' Wenn kein Fehler aufgetreten ist, dann liefert File ein Fragezeichen If strFilename <> "?" Then Response.Write strFilename If nLine > 0 Then Response.Write ", Zeile " & nLine End If If nColumn > 0 Then Response.Write ", Spalte " & nColumn End If If Len(strErrorSource) > 0 Then Response.Write "<br><pre>" & _ Server.HTMLEncode(strErrorSource) & "<br>" If nColumn > 0 Then Response.Write String((nColumn - 1), "-") & "^</pre><br>" End If End If End If %>
Zuerst lese ich alle Eigenschaften aus, da ich sie mehrmals verwende. Danach gebe ich alle erhaltenen Informationen einfach an den Betrachter der Fehlerseite aus.
Wichtig in diesem Zusammenhang ist, daß die Fehlerbehandlungsseite von ASP via Server.Transfer aufgerufen wird. Das bedeutet, als Programmierer habe ich Zugriff auf die unmodifizierten Request Collections, inklusive Form, QueryString und ServerVariables. Damit hat man einen guten Startpunkt, um einen guten Fehlerbericht aufzubereiten.
Neben der sicher dringenden Notwendigkeit dieses Skript designmäßig aufzumotzen kann man zusätzliche Funktionen einbauen, so zum Beispiel den ASP Fehler einem Administrator/Programmierer zu mailen, in einer Datenbank mitzuloggen und anderes mehr. Ebenfalls nicht aus dem Auge lassen sollte man die Möglichkeit, pro Web Applikation (eigentlich sogar bis auf einzelne Dateien hinab) eine eigene Fehlerseite definieren zu können - damit lassen sich für besonders kritische Skripts eigene Fehlerbehandlungsdateien generieren.
Was passiert eigentlich, wenn in der zentralen Fehlerbehandlungsdatei ein ASP Fehler auftritt? Nichts - dieser Fehler wird dann normal angezeigt, die Fehlerseite wird nicht noch einemal aufgerufen.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000512.zip
Debuggen von ASP Skripts - Teil 1
http:/www.aspheute.com/artikel/20000818.htm
Fehlerbehandlung richtig eingesetzt
http:/www.aspheute.com/artikel/20001011.htm
Serverseitige Redirects mit IIS5
http:/www.aspheute.com/artikel/20000509.htm
Zwischenspeichern von ASP Seiten
http:/www.aspheute.com/artikel/20000517.htm
500-100.asp Returns "Type Mismatch" Error After Request.BinaryRead() Method
http://support.microsoft.com/support/kb/articles/Q244/7/58.ASP
500-100.asp Returns "Variable is Undefined" Error When Session State is Disabled
http://support.microsoft.com/support/kb/articles/Q244/7/73.ASP
HTTP 500 Error Message Displays Instead of ASP Error Message from 500-100.asp
http://support.microsoft.com/support/kb/articles/Q261/2/00.ASP
©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.