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

Fehlerbehandlung richtig eingesetzt

Geschrieben von: Christian Koller
Kategorie: ASP Tricks

This printed page brought to you by AlphaSierraPapa

Fehlerbehandlung in ASP Seiten ist ein Thema, das viel zu oft vernachlässigt wird. ASP Seiten werden von Entwicklern geschrieben und getestet. Gedanken an das mögliche Auftreten von Fehlern werden ignoriert, Fehlerbehandlung findet nicht statt.

Wozu dient Fehlerbehandlung, wie funktioniert sie in ASP, und worauf muß man achten? Diese Fragen möchte der vorliegende Artikel anschneiden und beantworten.

Fehlerbehandlung in ASP

Wenn in einem ASP Skript ein Laufzeit-Fehler (run-time error) auftritt, so stoppt das Skript im allgemeinen und schreibt eine Fehlermeldung zum Browser. Um Laufzeitfehler im Skript selbst auffangen zu können, die Fehlermeldung zu unterdrücken und Informationen über Art und Quelle des Fehlers zu bekommen, erlaubt ASP in VBScript die Verwendung der Befehle "On Error Resume Next" und "On Error Goto 0".

On Error Resume Next bewirkt, daß das Skript auch bei einem Laufzeitfehler weiter ausgeführt wird. Der eigentliche Zweck des Befehls ist aber nicht, den Fehler nur zu unterdrücken, sondern das Skript weiter auszuführen um Fehlerbehandlungsroutinen dem Problem gemäß reagieren zu lassen.

Die eigentliche Fehlerbehandlung benutzt das ASP Objekt namens Err. Mittels Err Objekt kann nicht nur der Error-Code des letzten Laufzeitfehlers, sondern seine Quelle und eine kurze Beschreibung des Fehlers ausgelesen werden.

Selbstverständlich kann man die Wirkung des "On Error Resume Next" Befehles wieder aufheben. Dazu dient der Befehl "On Error Goto 0".

Um nun einen Teil des Sourcecodes eines ASP Skripts in einer Fehlerbehandlung zu kapseln, benutzt man einen Codeblock wie folgt:

%lt;%

' Fehler abfangen
On Error Resume Next

' Es tritt ein Fehler auf:
strA = missingObject.Property

' Auf Fehler pruefen
If Err.Number <> 0 Then
   ' Fehlerbehandlung:
   Response.Write("Es ist ein Laufzeitfehler aufgetreten!
") Response.Write("Fehlercode: " & Err.Number & "
") Response.Write("Quelle: " & Err.Source & "
") Response.Write("Beschreibung: " & Err.Description & "
") End If ' Fehler nicht mehr abfangen On Error Goto 0 %>

Die Fehlerbehandlung wird mit dem Befehl On Error Resume Next eingeleitet. Der Befehl selbst bewirkt, daß das Skript auch nach einem Laufzeitfehler weiter ausgeführt wird, solange nicht der Befehl On Error Goto 0 die Fehlerbehandlung wieder beendet.

Tritt nun ein Fehler auf, weil zum Beispiel ein Objekt im Skript nicht instanziert wurde, so enthält die Number Eigenschaft des Err Objektes einen Wert verschieden von Null. Dementsprechend kann man die Fehlerbehandlung, wie im Skript gezeigt, starten lassen, wenn Err.Number verschieden von Null ist.

Die Fehlerbehandlungsroutine selbst kann aus dem Err Objekt den Fehlercode (Err.Number), die Quelle des Fehlers (Err.Source) und eine Kurzbeschreibung des Fehlers (Err.Description) auslesen.

Das vorher angeführte Beispielskript gibt zum Beispiel die folgende Meldung zurück:


Bild 1: Ausgabe von Fehlernummer, Quelle und Beschreibung.

Welcher Fehler welchen Fehlercode zurück gibt, sieht man am besten, indem man den Fehler provoziert.

Fallstricke bei der Fehlerbehandlung

Manche Programmierer setzen dem On Error Resume Next Befehl einfach mal vorsichtshalber in jedes ASP Skript. Dies in der Hoffnung, daß damit allfällig auftretende Fehler überdeckt werden, und der Benutzer vom Fehler selbst nichts mitbekommt. Eine etwas kurzsichtige Denkweise. Wenn ein ASP Befehl einen Laufzeit-Fehler verursacht, so liegt das meist an der Kurzsichtigkeit des Programmierers, der nicht in der Lage war abzuschäzten, welche Probleme möglicherweise auftauchen könen.

Ein typisches Beispiel, wie man es NICHT machen sollte:

<%

On Error Resume Next
' Ab hier kann ein Fehler Unheil anrichten, soviel er will:


Set recordset = Connection.Execute("SELECT * FROM tTable")

' Diese Schleife wird zur Endlosschleife
Do While Not recordset.EOF
%>
Name:
<%= recordset("Name") %><br>

<%
   recordset.MoveNext
Loop 
%>

Das Skript unterdrückt alle Laufzeit-Fehler, die während der Ausführung des Skripts auftreten. Da im speziellen Fall das Objekt recordset nicht existiert, weil es nicht erstellt werden konnte, wird die Abfrage nach recordset.EOF in der Abbruchbedingung der Do While Schleife erst gar nicht vollständig ausgeführt. Da der Fehler vom On Error Resume Next Befehl unterdürckt worden ist, wird die Schleife zur Endlosschleife, was schließlich den Webserver zum Absturz bringen kann (Überlastung des Arbeitsspeichers oder der CPU wie in Bild 2). Bild 2 ist direkt eine Aufnahme des Windows Task Manager, nachdem das Programm auf einem Windows 2000 Server gestartet wurde. Bereits nach etwa 20 Sekunden hat dieses ASP Skript 700 MB des Server-Speichers belegt. Schließlich versagte der dllhost.exe Prozess, den ich daraufhin terminierte (starkes Abflachen der Kurve der Speicherbelegung).


Bild 2: Überlastung des Webservers

Im schlimmsten Fall kann das Aufrufen eines solchen Skripts zur Folge haben, daß der Webserver neu gestartet werden muß, da er auf Browseranfragen nicht mehr reagiert - und dies alles nur wegen einer mißbräuchlichen Verwendung von On Error Resume Next!

Ein beliebter Fehler ist auch, den Befehl On Error Goto 0 unabsichtlich zu vergessen - mit den gleichen Folgen.

Sinnvoller Einsatz der Fehlerbehandlung

Grundsätzlich sollte Fehlerbehandlung und insbesondere der On Error Resume Next Befehl nur dort eingesetzt werden, wo ein Laufzeitfehler beim Eintreffen bestimmter Umstaände nicht zu vermeiden ist, und die Umstände selbst nicht geprüft werden können.

Ein typüisches Beispiel für eine sinnvolle Fehlerbehandlung ist die Verwendung in Zusammenhang mit dem Schreiben von Text in Dateien mittels FileSystemObject: Um von ASP aus auf die Festplatte des Servers zu schreiben, muß der IUSR_MachineName Account die Schreibberechtigung für die Dateien und Verzeichnisse der NTFS Partition der Festplatte haben. Ansonsten würde bei jedem Schreibversuch (oder beim Öffnen einer Datei zum Schreiben ein Laufzeitfehler auftreten. Das folgende Skript ist das modifizierte Skript aus dem ASPHeute Artikel "Schreiben einer Textdatei auf den Server". Das Skript versucht nicht nur einen Text auf die Festplatte zu schreiben, es fängt auch einen möglichen Laufzeitfehler beim Erstellen der Textdatei mittels objFs.CreateTextFile auf und gibt eine entsprechende Fehlermeldung aus:

<%
 Set objFs= CreateObject("Scripting.FileSystemObject")
 strDateiname = Server.MapPath("/testdatei.txt") 

 On Error resume Next
 Set objTextStream = objFs.CreateTextFile(strDateiname, True)
 ' Fehler wenn IUSR_Machine Account keine Schreibrechte hat!

 If Err.Number <> 0 Then
   Response.Write("Konnte Datei nicht &ouml;ffen!")
   Response.End
 End If
 On Error Goto 0
  
 strWriteString = "Text fuer die Datei"
 objTextStream.Write strWriteString

 objTextStream.Close
 Set objTextStream = Nothing
 Set objFs = Nothing
 Response.Write "Der folgende Inhalt wurde in die Datei "
 Response.Write strDateiname & " geschrieben:<BR>" 
 Response.Write Replace(Server.HTMLEncode(strWriteString) , _ 
      vbCrLf,"<BR>" & vbCrLf)
%>

Schlußbemerkung

Fehlerbehandlung ist überall da sinnvoll einsetzbar, wo man Laufzeitfehler nicht im vornherein ausschließen und vermeiden kann.

Vor eine mißbräuchlichen Verwendung des Befehls On Error Resume Next möchte ich eindringlich warnen. Damit Programmierfehler zu kaschieren kann im schlechtesten Fall zum laufenden Absturz des Webservers führen!

This printed page brought to you by AlphaSierraPapa

Download des Codes

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

Verwandte Artikel

ASP-Fehlerbehandlung unter IIS5
http:/www.aspheute.com/artikel/20000512.htm
Schreiben einer Textdatei auf den Server
http:/www.aspheute.com/artikel/20000725.htm
Strukturierter Aufbau in der ASP-Programmierung
http:/www.aspheute.com/artikel/20011112.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.