Freigeben über


Elemente der Laufzeitfehlerbehandlung

Fehler und Fehlerbehandlung

Wenn Sie eine Anwendung programmieren, müssen Sie berücksichtigen, was passiert, wenn ein Fehler auftritt. Ein Fehler kann in Ihrer Anwendung aus einem von zwei Gründen auftreten. Erstens führt eine Bedingung zum Zeitpunkt der Ausführung der Anwendung dazu, dass andernfalls gültiger Code fehlschlägt. Wenn Ihr Code beispielsweise versucht, eine Tabelle zu öffnen, die der Benutzer gelöscht hat, tritt ein Fehler auf. Zweitens enthält Ihr Code möglicherweise falsche Logik, die verhindert, dass er die beabsichtigten Aktionen ausführt. Beispielsweise tritt ein Fehler auf, wenn ihr Code versucht, einen Wert durch 0 (null) zu dividieren.

Wenn Sie keine Fehlerbehandlung implementiert haben, unterbricht Visual Basic die Ausführung und zeigt eine Fehlermeldung an, wenn in Ihrem Code ein Fehler auftritt. Der Benutzer Ihrer Anwendung ist in diesem Fall möglicherweise verunsichert und enttäuscht. Sie können viele Probleme vermeiden, indem Sie in Ihrem Code gründliche Fehlerbehandlungsroutinen vorsehen, die alle potenziellen Fehler behandeln.

When adding error handling to a procedure, you should consider how the procedure will route execution when an error occurs. Der erste Schritt beim Weiterleiten der Ausführung an einen Fehlerhandler besteht darin, einen Fehlerhandler zu aktivieren, indem eine Form der On Error-Anweisung in die Prozedur eingeschlossen wird. The On Error statement directs execution in event of an error. Wenn keine On Error-Anweisung vorhanden ist, hält Visual Basic die Ausführung einfach an und zeigt eine Fehlermeldung an, wenn ein Fehler auftritt.

Tritt ein Fehler in einer Prozedur mit einer aktivierten Fehlerbehandlunsroutine auf, zeigt Visual Basic die übliche Fehlermeldung nicht an. Stattdessen wird die Ausführung an eine Fehlerbehandlungsroutine übergeben, sofern eine solche vorhanden ist. Wird die Ausführung an eine aktivierte Fehlerbehandlungsroutine übergeben, wird diese Fehlerbehandlungsroutine aktiv. Innerhalb der aktiven Fehlerbehandlungsroutine können Sie bestimmen, welcher Fehlertyp aufgetreten ist, und diesen in der gewünschten Weise behandeln. Access stellt drei Objekte bereit, die Informationen zu aufgetretenen Fehlern enthalten: das ADO Error-Objekt , das Visual Basic Err-Objekt und das DAO Error-Objekt .

Routingausführung bei Auftreten eines Fehlers

Eine Fehlerbehandlungsroutine gibt an, was innerhalb einer Prozedur geschieht, wenn ein Fehler auftritt. Sie möchten z.B., dass die Prozedur beendet wird, wenn ein bestimmter Fehler auftritt, oder Sie möchten die Bedingung korrigieren, die den Fehler ausgelöst hat, und die Ausführung wieder aufnehmen. Die Anweisungen On Error und Resume bestimmen, wie die Ausführung im Falle eines Fehlers abläuft.

On Error-Anweisung

Die Anweisung On Error aktiviert oder deaktiviert eine Fehlerbehandlungsroutine. Wird eine Fehlerbehandlungsroutine aktiviert, wird die Ausführung beim Auftreten eines Fehlers an die Fehlerbehandlungsroutine übergeben.

Es werden drei Formen von On Error-Anweisungen unterschieden: On Error GoTo Marke, On Error GoTo 0 und On Error Resume Next. Die Anweisung On Error GoTo Marke aktiviert eine Fehlerbehandlungsroutine, beginnend mit der Zeile, in der sich die Anweisung befindet. Aktivieren Sie daher die Fehlerbehandlungsroutine vor der ersten Zeile, in der ein Fehler auftreten kann. Ist die Fehlerbehandlungsroutine aktiv und tritt ein Fehler auf, wird die Ausführung an die Zeile übergeben, die durch das Argument Marke festgelegt ist.

Die im Argument Marke angegebene Zeile sollte den Beginn der Fehlerbehandlungsroutine enthalten. Die folgende Prozedur gibt beispielsweise an, dass die Ausführung an die Zeile mit der Bezeichnung übergeht, wenn ein Fehler auftritt:

Function MayCauseAnError() 
    ' Enable error handler. 
    On Error GoTo Error_MayCauseAnError 
    .            ' Include code here that may generate error. 
    . 
    . 
 
Error_MayCauseAnError: 
    .            ' Include code here to handle error. 
    . 
    . 
End Function

Die Anweisung On Error GoTo 0 deaktiviert die Fehlerbehandlungsroutine innerhalb einer Prozedur. Sie gibt die Zeile 0 nicht als Start des Fehlerbehandlungscode an, selbst wenn die Prozedur eine Zeile mit der Nummer 0 enthält. Enthält Ihr Code keine Anweisung On Error GoTo 0, wird die Fehlerbehandlungsroutine automatisch deaktiviert, wenn die Prozedur vollständig ausgeführt wurde. Die On Error GoTo 0 -Anweisung setzt die Eigenschaften des Err -Objekts zurück und hat somit dieselbe Wirkung wie die Clear -Methode des Err -Objekts.

Die Anweisung On Error Resume Next ignoriert die Zeile, die einen Fehler verursacht hat, und übergibt die Ausführung an die sich daran anschließende Zeile. Die Ausführung wird dabei nicht unterbrochen. Verwenden Sie die On Error Resume Next-Anweisung , wenn Sie die Eigenschaften des Err-Objekts unmittelbar nach einer Zeile überprüfen möchten, in der ein Fehler auftritt, und den Fehler innerhalb der Prozedur und nicht in einem Fehlerhandler behandeln möchten.

Resume-Anweisung

Die Anweisung Resume führt die Ausführung aus einer Fehlerbehandlungsroutine heraus zurück zum Kern der Prozedur. Sie können eine Anweisung Resume in eine Fehlerbehandlungsroutine setzen, wenn Sie möchten, dass die Ausführung an einem bestimmten Punkt der Prozedur fortgeführt wird. Eine Anweisung Resume ist jedoch nicht notwendig, Sie können die Prozedur nach der Fehlerbehandlungsroutine auch beenden.

Es werden drei Formen der Anweisung Resume unterschieden. Die Anweisung Resume- oder Resume 0 setzt die Ausführung in der Zeile fort, in der der Fehler aufgetreten ist. Die Anweisung Resume Next setzt die Ausführung in der sich unmittelbar anschließenden Zeile fort. Die Anweisung Resume Marke setzt die Ausführung in der durch das Argument Marke angegebenen Zeile fort. Das Argument Marke muss entweder eine Zeilenmarke oder eine Zeilennummer festlegen.

Üblicherweise verwenden Sie die Anweisung Resume oder Resume 0, wenn der Benutzer eine Korrektur vornehmen muss. Wenn Sie den Benutzer z.B. auffordern, den Namen einer zu öffnenden Tabelle einzugeben, und dieser den Namen einer nicht vorhandenen Tabelle angibt, können Sie ihn erneut auffordern und die Ausführung mit der Anweisung fortsetzen, die den Fehler verursachte.

Sie verwenden die Resume Next-Anweisung, wenn Ihr Code den Fehler innerhalb einer Fehlerbehandlungsroutine korrigiert und Sie die Ausführung fortsetzen möchten, ohne die Zeile, die den Fehler verursachte, erneut auszuführen. Sie verwenden die Resume-Anweisung Marke, wenn Sie die Ausführung an einem anderen Punkt der Prozedur fortführen möchten, der durch das Argument Marke festgelegt ist. Vielleicht möchten Sie die Ausführung an einer Exit-Routine wiederaufnehmen, wie im folgenden Abschnitt beschrieben.

Beenden einer Prozedur

Wenn Sie in eine Prozedur eine Fehlerbehandlungsroutine aufnehmen, sehen Sie auch eine Exit-Routine vor, sodass die Fehlerbehandlungsroutine nur beim Auftreten eines Fehlers ausgeführt wird. Sie können eine Exit-Routine mit einer Zeilenmarke auf dieselbe Weise festlegen wie eine Fehlerbehandlungsroutine.

Sie können dem Beispiel im vorherigen Abschnitt z. B. eine Exit-Routine hinzufügen. Wenn kein Fehler auftritt, wird die Exitroutine nach dem Text der Prozedur ausgeführt. Beim Auftreten eines Fehlers wird die Ausführung an die Exit-Routine übergeben, nachdem der Code in der Fehlerbehandlungsroutine ausgeführt wurde. Die Exit-Routine enthält eine Exit-Anweisung.

Function MayCauseAnError() 
    ' Enable error handler. 
    On Error GoTo Error_MayCauseAnError 
    .            ' Include code here that may generate error. 
    . 
    . 
 
Exit_MayCauseAnError: 
    Exit Function 
 
Error_MayCauseAnError: 
    .            ' Include code to handle error. 
    . 
    . 
    ' Resume execution with exit routine to exit function. 
    Resume Exit_MayCauseAnError 
End Function

Behandeln von Fehlern in geschachtelten Prozeduren

Wenn in einer geschachtelten Prozedur, die über keinen aktivierten Fehlerhandler verfügt, ein Fehler auftritt, durchsucht Visual Basic die Aufrufliste rückwärts nach einem aktivierten Fehlerhandler in einer anderen Prozedur, anstatt einfach die Ausführung anzuhalten. Dadurch hat Ihr Code die Möglichkeit, den Fehler in einer anderen Prozedur zu beheben. Angenommen, Prozedur A ruft Prozedur B auf, und Prozedur B ruft Prozedur C auf. Wenn in Prozedur C ein Fehler auftritt und kein Aktivierter Fehlerhandler vorhanden ist, überprüft Visual Basic Prozedur B und dann Prozedur A auf einen aktivierten Fehlerhandler. Falls vorhanden, wird die Ausführung an diesen Fehlerhandler übergeben. Andernfalls wird die Ausführung angehalten, und eine Fehlermeldung wird angezeigt.

Visual Basic durchsucht die Aufrufliste auch rückwärts nach einer aktivierten Fehlerbehandlungsroutine, wenn innerhalb einer aktiven Fehlerbehandlungsroutine ein Fehler auftritt. Sie können erzwingen, dass Visual Basic die Aufrufliste rückwärts durchsucht, indem Sie einen Fehler innerhalb eines aktiven Fehlerhandlers mit der Raise-Methode des Err-Objekts auslösen. Dies bietet sich zur Behandlung von Fehlern an, die Sie innerhalb einer Fehlerbehandlungsroutine nicht erwarten. Tritt ein unvorhergesehener Fehler auf und Sie behandeln diesen innerhalb der Fehlerbehandlungsroutine, gibt die Ausführung die Aufrufliste zurück, bis eine andere Fehlerbehandlungsroutine gefunden wird, die zur Behandlung des Fehlers eingerichtet werden kann.

Angenommen, Prozedur C verfügt über eine aktivierte Fehlerbehandlungsroutine, die jedoch den aufgetretenen Fehler nicht behebt. Nachdem die Fehlerbehandlungsroutine alle Fehler überprüft hat, die Sie erwartet haben, kann sie den ursprünglichen Fehler neu generieren. Die Ausführung gibt dann die Aufrufliste zu der Fehlerbehandlungsroutine in Prozedur B zurück, sofern eine solche existiert, und bietet dieser Fehlerbehandlungsroutine die Möglichkeit, den Fehler zu behandeln. Ist in Prozedur B keine Fehlerbehandlungsroutine vorhanden, oder behebt sie den Fehler nicht und generiert ihn neu, wird die Ausführung an die Fehlerbehandlungsroutine in Prozedur A übergeben, sofern diese vorhanden ist.

Um dieses Konzept auf andere Weise zu veranschaulichen, nehmen Sie an, dass Sie über eine geschachtelte Prozedur verfügen, die die Fehlerbehandlung für einen Typkonflikt enthält, ein Fehler, den Sie erwartet haben. Irgendwann tritt innerhalb von Prozedur C ein Division by Zero-Fehler auf, den Sie nicht erwartet haben. Wenn Sie eine Anweisung zum erneuten Generieren des ursprünglichen Fehlers eingefügt haben, übergibt die Ausführung die Aufrufliste an einen anderen aktivierten Fehlerhandler, sofern vorhanden. Wenn Sie in einer anderen Prozedur in der Aufrufliste einen Fehler der Division durch Null korrigiert haben, wird der Fehler behoben. Wenn Ihr Code den Fehler nicht erneut generiert, wird die Prozedur ohne Korrektur des Fehlers division by zero fortgesetzt. Dies wiederum kann andere Fehler innerhalb des Satzes geschachtelter Prozeduren verursachen.

Zusammenfassend durchsucht Visual Basic die Aufrufliste in den folgenden Fällen rückwärts nach einer aktivierten Fehlerbehandlungsroutine:

  • Wenn in einer Prozedur, die keine aktivierte Fehlerbehandlungsroutine enthält, ein Fehler auftritt.

  • Wenn innerhalb einer aktivierten Fehlerbehandlungsroutine ein Fehler auftritt. Wenn Sie zum Neuerzeugen eines Fehlers die Methode Raise des Objekts Err verwenden, können Sie erzwingen, dass Visual Basic die Aufrufliste rückwärts nach einer aktivierten Fehlerbehandlungsroutine durchläuft.

Abrufen von Informationen zu einem Fehler

Nachdem die Ausführung an die Fehlerbehandlungsroutine übergeben wurde, muss Ihr Code bestimmen, welcher Fehler aufgetreten ist, und ihn adressieren. In Visual Basic und Microsoft Access werden mehrere Sprachelemente bereitgestellt, mit deren Hilfe Sie Informationen zu einem bestimmten Fehler anfordern können. Jedes ist jeweils für einen anderen Fehlertyp geeignet. Da Fehler in verschiedenen Teilen Ihrer Anwendung auftreten können, bestimmen Sie anhand der jeweils erwarteten Fehler, welches Element Sie in Ihrem Code verwenden.

Zur Fehlerbehandlung stehen die folgenden Sprachelemente zur Verfügung:

Err-Objekt

Das Objekt Err wird von Visual Basic bereitgestellt. Wenn ein Visual Basic-Fehler auftritt, werden Informationen über diesen Fehler im Objekt Err gespeichert. Das Err -Objekt verwaltet Informationen zu jeweils nur einem Fehler. Tritt ein neuer Fehler auf, wird das Err -Objekt dahingehend aktualisiert, dass es stattdessen Informationen zu diesem Fehler enthält.

Um Informationen zu einem bestimmten Fehler abzurufen, können Sie die Eigenschaften und Methoden des Err-Objekts verwenden:

  • Die Number-Eigenschaft ist die Standardeigenschaft des Err-Objekts . es gibt die identifizierende Nummer des aufgetretenen Fehlers zurück.
  • Die Description-Eigenschaft des Err-Objekts gibt die beschreibende Zeichenfolge zurück, die einem Visual Basic-Fehler zugeordnet ist.
  • Die Methode Clear löscht die aktuellen Fehlerinformationen aus dem Objekt Err.
  • Die Methode Raise generiert einen spezifischen Fehler neu und liefert den Eigenschaften des Objekts Err die Informationen zu diesem Fehler.

Das folgende Beispiel zeigt, wie Sie das Objekt Err in einer Prozedur verwenden können, die eine fehlende Typübereinstimmung auslösen kann:

Function MayCauseAnError() 
    ' Declare constant to represent likely error. 
    Const conTypeMismatch As Integer = 13 
 
    On Error GoTo Error_MayCauseAnError 
        .            ' Include code here that may generate error. 
        . 
        . 
 
Exit_MayCauseAnError: 
    Exit Function 
 
Error_MayCauseAnError: 
    ' Check Err object properties. 
    If Err = conTypeMismatch Then 
        .            ' Include code to handle error. 
        . 
        . 
    Else 
        ' Regenerate original error. 
        Dim intErrNum As Integer 
        intErrNum = Err 
        Err.Clear 
        Err.Raise intErrNum 
    End If 
    ' Resume execution with exit routine to exit function. 
    Resume Exit_MayCauseAnError 
End Function

Beachten Sie, dass im oben stehenden Beispiel die Methode Raise zum neuen Generieren des ursprünglichen Fehlers verwendet wird. Tritt ein anderer Fehler als eine fehlende Typübereinstimmung auf, wird die Ausführung an eine andere, innerhalb der Aufrufliste zurückliegende aktivierte Fehlerbehandlungsroutine übergeben, sofern eine solche vorhanden ist.

Das Objekt Err liefert Ihnen alle Informationen, die Sie zu Visual Basic-Fehlern benötigen. Sie erhalten jedoch keine vollständigen Informationen zu Access-Fehlern oder Access-Datenbank-Engine-Fehlern. Access and Data Access Objects (DAO)) stellen zusätzliche Sprachelemente bereit, die Sie bei diesen Fehlern unterstützen.

Error-Objekt und Errors-Auflistung

Das Error-Objekt und die Errors-Auflistung werden durch ADO und DAO zur Verfügung gestellt. Das Error-Objekt stellt einen ADO- oder DAO-Fehler dar. Eine einzige ADO- oder DAO-Operation kann mehrere Fehler verursachen, insbesondere, wenn Sie DAO-ODBC-Operationen ausführen. Jedem Fehler, der während einer bestimmten Datenzugriffsoperation auftritt, ist ein Error-Objekt zugeordnet. Alle einer bestimmten ADO- oder DAO-Operation zugeordneten Error-Objekte sind in der Errors-Auflistung gespeichert, wobei der Fehler der niedrigsten Ebene das erste Objekt in der Auflistung und der Fehler der höchsten Ebene das letzte Objekt in der Auflistung darstellt.

Wenn ein ADO- oder DAO-Fehler auftritt, enthält das Err-Objekt von Visual Basic die Fehlernummer für das erste Objekt in der Errors-Auflistung . Überprüfen Sie die Errors-Auflistung , um festzustellen, ob zusätzliche ADO- oder DAO-Fehler aufgetreten sind. Die Werte der Eigenschaften ADO Number oder DAO Number und ADO Description oder DAO Description des ersten Error-Objekts in der Errors-Auflistung sollten mit den Werten der Number - und Description-Eigenschaften des Visual Basic Err-Objekts übereinstimmen.

AccessError-Methode

Verwenden Sie die Raise-Methode des Err-Objekts , um einen Visual Basic-Fehler zu generieren, der noch nicht aufgetreten ist, und bestimmen Sie die beschreibende Zeichenfolge, die diesem Fehler zugeordnet ist. Sie können die Raise-Methode jedoch nicht verwenden, um einen Access-Fehler, einen ADO-Fehler oder einen DAO-Fehler zu generieren. Verwenden Sie die AccessError-Methode , um die beschreibende Zeichenfolge zu bestimmen, die einem Access-Fehler, einem ADO-Fehler oder einem DAO-Fehler zugeordnet ist, der tatsächlich nicht aufgetreten ist.

Fehlerereignis

Verwenden Sie das Error-Ereignis, um Fehler abzufangen, die in einem Access-Formular oder -Bericht auftreten. Versucht ein Benutzer z.B. Text in ein Feld des Datentyps Datum/Uhrzeit einzugeben, tritt das Ereignis Error ein. Wenn Sie einem Formular Personal eine Ereignisprozedur Error hinzufügen und dann versuchen, einen Textwert in das Feld Einstellungsdatum einzugeben, wird die Ereignisprozedur Error ausgeführt.

Die "Error"-Ereignisprozedur nimmt das ganzzahlige "DataErr"-Argument an. Wird eine "Error"-Ereignisprozedur ausgeführt, enthält das "DataErr"-Argument die Nummer des aufgetretenen Access-Fehlers. Die einzige Möglichkeit, die Fehlernummer des aufgetretenen Fehlers zu bestimmen, besteht darin, den Wert des "DataErr"-Arguments zu überprüfen. Das Err-Objekt wird nach dem Auftreten des Error-Ereignisses nicht mit Fehlerinformationen aufgefüllt. Verwenden Sie den Wert des DataErr-Arguments zusammen mit der AccessError-Methode , um die Anzahl des Fehlers und seine beschreibende Zeichenfolge zu bestimmen.

Hinweis

Die Error-Anweisung und die Error-Funktion sind nur aus Gründen der Rückwärtskompatibilität vorgesehen. Wenn Sie neuen Code schreiben, verwenden Sie die Objekte Err und Error, die AccessError-Methode und das Error-Ereignis, um Informationen zu einem Fehler zu erhalten.

Informationen zu den Mitwirkenden

Vom Communitymitgliedbereitgestellter Link Symbol der UtterAccess-Community.

  • Fehler

UtterAccess ist das führende Microsoft Access-Wiki und -Hilfeforum.

Siehe auch

Support und Feedback

Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.