Fehlerbehandlung richtig eingesetzt
Geschrieben von: Christian Koller 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 ASPWenn 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! 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:
Welcher Fehler welchen Fehlercode zurück gibt, sieht man am besten, indem man den Fehler provoziert. Fallstricke bei der FehlerbehandlungManche 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).
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 FehlerbehandlungGrundsä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 ö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ßbemerkungFehlerbehandlung 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! Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
ASP-Fehlerbehandlung unter IIS5 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.
©2000-2006 AspHeute.com |