Freigeben über


Behandeln von Laufzeitfehlern

Laufzeitfehler treten nach dem Aufrufen einer Anwendung auf. Die folgenden Aktionen (bzw. der Versuch, diese Aktionen auszuführen) generieren Laufzeitfehler: Schreiben in eine nicht vorhandene Datei, Öffnen einer bereits geöffneten Datei, Auswahl einer bereits geschlossenen Tabelle, Herbeiführen eines Datenkonflikts, Division durch Null usw.

Manchmal können Fehler auftreten, wenn Benutzer Ihre Anwendung ausführen. Sie können eine eigene Fehlerbehandlungsroutine aufrufen, indem Sie ON ERROR in Ihren Code einschließen. In der Regel verwendet ON ERROR einen Do-Befehl, um eine Routine zur Behandlung des Fehlers auszuführen, z. B.:

ON ERROR DO My_Error

Falls Ihre Anwendung keine Fehlerbehandlungsroutinen enthält und ein Fehler auftritt, wird die Anwendung angehalten, und Visual FoxPro zeigt eine Fehlermeldung mit den folgenden Optionen an:

  • Abbrechen   Falls ein Benutzer Abbrechen auswählt, beendet Visual FoxPro sofort die Ausführung der Anwendung und gibt die Steuerung an das System zurück.
  • Ignorieren   Falls ein Benutzer Ignorieren auswählt, ignoriert Visual FoxPro die Zeile, die den Fehler verursacht hat, und fährt mit der nächsten Zeile im Programm fort.

Eine vollständige Liste und Erklärung der Fehlermeldungen von Visual FoxPro finden Sie unter Fehlermeldungen.

Tipp   Sie sollten den Benutzern auf jeden Fall eine Dokumentation zu den Fehlern zur Verfügung stellen, die angezeigt werden können. Diese Dokumentation sollte darüber hinaus auch Lösungsmöglichkeiten für die Fehlerbehandlung aufzeigen.

Die folgenden Befehle und Funktionen eignen sich für das Vorhersehen und das Behandeln von Laufzeitfehlern.

Aufgabenstellung Verknüpfungsart
Füllen eines Arrays mit Fehlerinformationen AERROR( )
Öffnen des Debugger- oder Programmverfolgungsfensters DEBUG oder SET STEP ON
Generieren eines bestimmten Fehlers zum Testen der Fehlerbehandlung ERROR
Rückgabe einer Fehlernummer ERROR( )
Rückgabe der Zeilennummer eines ausgeführten Programms LINENO( )
Rückgabe einer Zeichenfolge für eine Fehlermeldung MESSAGE( )
Ausführen eines Befehls beim Auftreten eines Fehlers ON ERROR
Zurückgeben des Befehls, der beim Auftreten eines Fehlers ausgeführt wird ON( )
Rückgabe des Namens des derzeit ausgeführten Programms PROGRAM( ) oder SYS(16)
Erneutes Ausführen des letzten Befehls RETRY
Rückgabe eines beliebigen aktuellen Fehlermeldungsparameters SYS(2018)

Vorhersehen von Fehlern

Der beste Schutz gegen Laufzeitfehler ist es, diese vorherzusehen und mit entsprechendem Code zu verhindern. So verschiebt z. B. die folgende Codezeile den Datensatzzeiger auf den nächsten Datensatz der Tabelle.

SKIP

Das funktioniert nur, solange der Datensatzzeiger nicht bereits hinter den letzten Datensatz der Tabelle verschoben wurde. In diesem Fall tritt ein Fehler auf.

Die folgenden Codezeilen berücksichtigen diese Fehlermöglichkeit und vermeiden sie:

IF !EOF()
   SKIP
      IF EOF()
         GO BOTTOM
      ENDIF
ENDIF

In einem weiteren Beispiel wird durch die folgende Codezeile das Dialogfeld Öffnen angezeigt, damit der Benutzer in einem neuen Arbeitsbereich eine Tabelle öffnen kann:

USE GETFILE('DBF') IN 0

Hier kann das Problem auftreten, dass der Benutzer auf Abbrechen klicken oder den Namen einer nicht existierenden Datei eingeben könnte. Der folgende Code berücksichtigt diese Fehlermöglichkeit und stellt vor dem Verwenden der Datei sicher, dass diese existiert:

cNewTable = GETFILE('DBF')
IF FILE(cNewTable)
   USE (cNewTable) IN 0
ENDIF

Der Endbenutzer könnte auch den Namen einer Datei eingeben, die keine Visual FoxPro-Tabelle ist. Zur Vermeidung dieser Fehlermöglichkeit können Sie die Datei mit einfachen E/A-Funktionen öffnen und den binären Dateikopf überprüfen, um festzustellen, ob es sich bei der Datei wirklich um eine gültige Tabelle handelt. Das erfordert jedoch einen gewissen Aufwand und könnte die Anwendung spürbar verlangsamen. Stattdessen empfiehlt es sich, die Situation zur Laufzeit zu behandeln, indem eine Fehlermeldung wie "Dies ist keine Tabelle. Bitte öffnen Sie eine andere Datei!" ausgegeben wird, wenn Fehler 15 ("Keine Tabelle") auftritt.

Sie können nicht alle Fehler vorhersehen (und möchten es wahrscheinlich auch nicht). Daher können Sie einige Fehler abfangen, indem Sie einen Programmcode erstellen, der beim Auftreten eines Laufzeitfehlers ausgeführt wird.

Behandeln prozedualer Fehler

Tritt in einem prozedualem Code ein Fehler auf, so sucht Visual FoxPro nach mit einer ON ERROR-Routine verknüpftem Code zur Fehlerbehandlung. Existiert keine ON ERROR-Routine, zeigt Visual FoxPro die Standardfehlermeldung an. Eine vollständige Liste der Fehlermeldungen und -nummern von Visual FoxPro finden Sie in der Hilfe.

Erstellen von ON ERROR-Routinen

Sie können nach ON ERROR jeden gültigen Visual FoxPro-Befehl oder -Ausdruck angeben. Normalerweise wird dort jedoch eine Prozedur oder ein Programm zur Fehlerbehandlung aufgerufen.

Zum Veranschaulichen der Funktionsweise von ON ERROR können Sie im Befehlsfenster einmal einen unverständlichen Befehl eingeben:

qxy

Das Dialogfeld mit der Standardfehlermeldung von Visual FoxPro mit der Meldung "Unbekannter Befehl" wird angezeigt. Wenn Sie jedoch zuvor die folgenden Codezeilen ausgeführt haben, wird nicht die Standardfehlermeldung in einem Dialogfeld angezeigt, sondern im aktiven Ausgabefenster die Fehlernummer (16) ausgegeben.

ON ERROR ?ERROR()
qxy

Die Angabe von ON ERROR ohne weitere Angaben setzt die Fehlermeldungen von Visual FoxPro auf den Standard zurück:

ON ERROR

Der folgende Code enthält das Gerüst eines ON ERROR-Fehlerhandlers:

LOCAL lcOldOnError

* Save the original error handler
lcOldOnError = ON("ERROR")

* Issue ON ERROR with the name of a procedure
ON ERROR DO errhandler WITH ERROR(), MESSAGE()

* code to which the error handling routine applies

* Reset the original error handler
ON ERROR &lcOldOnError

PROCEDURE errhandler
LOCAL aErrInfo[1]
AERROR(aErrInfo)
DO CASE
   CASE aErrInfo[1] = 1 && File Does Not Exist
      * display an appropriate message
      * and take some action to fix the problem.
   OTHERWISE
      * display a generic message, maybe
      * send high priority mail to an administrator
ENDPROC

Behandeln von Fehlern in Klassen und Objekten

Tritt im Code einer Methode ein Fehler auf, so sucht Visual FoxPro nach mit dem Error-Ereignis des Objekts verknüpften Code zur Fehlerbehandlung. Wurde für das Error-Ereignis dieses Objekts kein Code erstellt, so wird der von der übergeordneten Klasse geerbte Code für das Error-Ereignis ausgeführt (wobei diese u.U. den Code ebenfalls von einer in der Klassenhierarchie höher angeordneten Klasse geerbt hat). Wurde in der Klassenhierarchie ebenfalls kein Code für das Error-Ereignis erstellt, so sucht Visual FoxPro nach einer ON ERROR-Routine. Existiert keine ON ERROR-Routine, zeigt Visual FoxPro die Standardfehlermeldung an.

Der große Vorteil von Klassen ist darin zu sehen, dass alle von einem Steuerelement benötigten Komponenten, einschließlich der Fehlerbehandlung, zusammengefasst (gekapselt) werden können, so dass das Steuerelement in einer Vielzahl möglicher Umgebungen eingesetzt werden kann. Stoßen Sie zu einem späteren Zeitpunkt auf eine weitere Fehlermöglichkeit des Steuerelements, können Sie der Klasse eine Fehlerbehandlung für diesen Fehler hinzufügen. Diese Fehlerbehandlung wird dann automatisch von allen auf dieser Klasse basierenden Objekten geerbt.

So basiert z. B. die Klasse vcr in der Klassenbibliothek Buttons.vcx, die sich im Visual FoxPro-Verzeichnis \Samples\Classes befindet, auf der Containerklasse von Visual FoxPro.

Die vier Befehlsschaltflächen im Container steuern die Tabellennavigation, indem sie den Datensatzzeiger in der Tabelle mit Hilfe der folgenden Befehle verschieben:

GO TOP
SKIP - 1
SKIP 1
GO BOTTOM.

Verwendet der Benutzer eine der Schaltflächen, wenn keine Tabelle geöffnet ist, so tritt ein Fehler auf. Visual FoxPro versucht beim Verschieben des Datensatzzeigers, zwischengespeicherte Werte in die Tabelle zurückzuschreiben. Somit könnte auch dann ein Fehler auftreten, wenn bei aktivierter optimistischer zeilenweiser Zwischenspeicherung ein anderer Benutzer zwischenzeitlich einen Wert im zwischengespeicherten Datensatz geändert hat.

Da diese Fehler bei jeder der vier Befehlsschaltflächen auftreten können, ist es nicht sinnvoll, vier verschiedene Fehlerbehandlungsmethoden einzusetzen. Der folgende mit dem Error-Ereignis der Schaltflächen verknüpfte Code übergibt die Fehlerinformation an die Fehlerbehandlungsroutine der Klasse:

LPARAMETERS nError, cMethod, nLine
THIS.Parent.Error(nError, cMethod, nLine)

Der folgende Code ist mit dem Error-Ereignis der vcr-Klasse verbunden. Der tatsächliche Code unterscheidet sich allerdings aufgrund der Codierungsanforderungen für die Lokalisierung von diesem.

Parameters nError, cMethod, nLine
DO CASE
CASE nError = 13 && Alias not found
   cNewTable = GETFILE('DBF')
   IF FILE(cNewTable)
      SELECT 0
      USE (cNewTable)
      This.SkipTable = ALIAS()
   ELSE
      This.SkipTable = ""
   ENDIF
CASE nError = 1585 && Data Conflict
* Update conflict handled by a datachecker class 
   nConflictStatus = ;
      THIS.DataChecker1.CheckConflicts()
   IF nConflictStatus = 2
      MESSAGEBOX "Can't resolve a data conflict."
   ENDIF
OTHERWISE
* Display information about other errors.

   cMsg="Error:" + ALLTRIM(STR(nError)) + CHR(13) ;
      + MESSAGE()+CHR(13)+"Program:"+PROGRAM()

   nAnswer = MESSAGEBOX(cMsg, 2+48+512, "Error")
   DO CASE
      CASE nAnswer = 3   &&Abort
         CANCEL
      CASE nAnswer = 4   &&Retry
         RETRY
      OTHERWISE       && Ignore
         RETURN
   ENDCASE
ENDCASE

Sie sollten sicherstellen, dass auch für nicht behandelte Fehler Informationen ausgegeben werden. Andernfalls würde der Code des Error-Ereignisses ausgeführt, ohne Aktionen vorzunehmen, und die Standardfehlermeldung von Visual FoxPro würde nicht länger angezeigt. Weder Sie noch die Benutzer wüssten, was passiert ist.

Je nach Benutzergruppe können Sie für den Fall von nicht behandelten Fehlern weitere Informationen bereitstellen, z. B. indem Sie eine Notfallnummer einrichten.

Rückkehr vom Fehlerbehandlungscode

Nach dem Ausführen des Fehlerbehandlungscodes wird die Zeile ausgeführt, die auf die den Fehler verursachende Codezeile folgt. Mit Hilfe des Befehls RETRY können Sie die Fehler verursachende Codezeile erneut ausführen, nachdem die Situation, die den Fehler verursacht hat, behoben wurde.

Anmerkung   Das Error-Ereignis kann auch dann aufgerufen werden, wenn der aufgetretene Fehler mit dem Code in keinem Zusammenhang steht. Wenn Sie z. B. die Methode CloseTables einer Datenumgebung aufrufen, AutoCloseTables auf Wahr (.T.) gesetzt ist und Sie dann das Formular freigeben, wird ein interner Fehler generiert, wenn Visual FoxPro versucht, die Tabellen erneut zu schließen. Sie können diesen Fehler zwar abfangen, aber es gibt keine Codezeile, die Sie mittels RETRY erneut ausführen können.

Verwenden von Routinen zum Beenden

Erstellen Sie eine eigene Routine zum Beenden, indem Sie den Befehl ON SHUTDOWN in Ihren Code einfügen. In der Regel verwendet ON SHUTDOWN einen DO-Befehl zum Aufrufen einer Routine, wenn Sie die Anwendung schließen möchten, wie im folgenden Beispiel gezeigt:

ON SHUTDOWN DO My_Shutdown

Die Routine enthält in der Regel ein Dialogfeld mit der Frage, ob der Benutzer die aktuelle Anwendung tatsächlich beenden möchte. Wenn der Benutzer die Anwendung beenden möchte, kann die Routine offene Dateien sowie die Visual FoxPro-Umgebung schließen und anschließend den Befehl QUIT ausführen. Wenn der Benutzer die aktuelle Anwendung nicht beenden möchte, übergibt die Routine die Steuerung wieder an die Anwendung.

Siehe auch

Protokollieren der Codeerfassung | Ausgabeanzeige | Testen und Debuggen von Anwendungen | ON ERROR | Anzeigen von gespeicherten Werten