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

ASP-Fehlerbehandlung unter IIS5

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:
EigenschaftBeschreibung
CategoryBeschreibt die Fehlerquelle: ASP interner Fehler, Skriptsprache, oder externes Objekt
NumberLiefert den Fehlercode als COM-Äquivalent (0x...)
DescriptionKurzbeschreibung des Fehlers
SourceFalls verfügbar, liefert den Sourcecode der Zeile, die den Fehler verursacht hat
FileName der ASP Datei, die ausgeführt wurde, als der Fehler auftrat. Liefert "?" wenn kein Fehler im AspError Objekt gespeichert ist.
LineZeile in der der Fehler ausgelöst wurde (0 bedeutet nicht verfügbar)
ColumnSpalte, in der der Fehler ausgelöst wurde (0 bedeutet nicht verfügbar)
ASPCodeIIS-generierter Fehlercode ("" bedeutet nicht verfügbar)
ASPDescriptionDetaillierte 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.

Schlußbemerkung

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

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000512.zip

Verwandte Artikel

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

Links zu anderen Sites

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.