Ich habe einen Code mit verschiedenen "On Error Goto" -Fehlerhandlern an einigen Stellen, um einige defekte Hardware von Drittanbietern zu behandeln. Ich bekam einen Überlauffehler (gelesen von der Err-Variable) in einer Routine, die keine Fehlerfalle hat, aber von einer Routine aufgerufen wird, die tut. Ich dachte immer, dass Fehler-Traps nur in der Routine gültig waren, für die sie deklariert wurden, aber es sieht so aus, als ob ein Fehler in einer Subroutine dazu führen kann, dass sie zur Fehler-Trap der aufrufenden Funktion geht.
Also habe ich die Fehler-Trap der aufrufenden Funktion ausgeschaltet und meinen Überlauf gefunden und alles ist gut. Aber bevor ich das tat, habe ich einige Zeit damit verbracht, einen programmatischen Weg zu finden, um VB dazu zu bringen, zu seiner Standardfehlerbehandlung innerhalb dieser Routine zurückzukehren (also würde ich keinen externen Code zum Debuggen ändern müssen), aber ich konnte nicht. Die einzigen Fehlerbefehle, die ich finden konnte:
%Vor%alle die manuelle Fehlerbehandlung einschalten - gibt es eine Möglichkeit, es auszuschalten (zurück zu den VB6 Standard)?
Dies wird ausführlich im VB6-Handbuch unter Fehlerbehandlungshierarchie erläutert . On Error Goto 0
deaktiviert den Fehlerhandler in der aktuellen Prozedur, nicht in den Prozeduren, die ihn aufgerufen haben.
Wenn ein Fehler in einer Prozedur auftritt und Diese Prozedur ist nicht aktiviert Fehlerhandler, Visual Basic-Suchen rückwärts durch die ausstehende Prozeduren in der Anrufliste - und führt die erste aus aktiviert Fehlerbehandlung, die es findet. Wenn es findet keinen aktivierten Fehler Handler irgendwo in der Anrufliste, es zeigt einen unerwarteten Standardfehler an Nachricht und stoppt die Ausführung.
Wie andere bereits gesagt haben, können Sie auf die Registerkarte Extras-Optionen-Allgemein gehen und Bei allen Fehlern unterbrechen wählen. Dadurch werden alle On Error-Anweisungen wirksam deaktiviert - die IDE bricht sofort bei jedem Fehler ab.
Das kann irritieren, wenn Ihr VB6-Code Fehler als Teil des normalen Betriebs auslöst. Zum Beispiel, wenn Sie prüfen, ob eine Datei existiert oder wenn der Benutzer in einem allgemeinen Dialog auf Abbrechen klickt. Sie möchten nicht, dass die IDE jedes Mal in diesen Zeilen bricht. Aber Sie könnten in allen Prozeduren für die Ereignisbehandlung Fehlercodes haben, um das Programm wegen unerwarteter Fehler abzustürzen. Aber sie sind ein Ärgernis, wenn Sie Probleme debuggen, da die IDE mit dem Fehler nicht in der Zeile bricht. Ein Trick besteht darin, diese Fehlerbehandlungsroutinen beim Ausführen in der IDE zu deaktivieren, sie jedoch in der ausführbaren Builddatei zu behalten. Du machst es so.
Lassen Sie diese Funktionen in ein Modul fallen.
%Vor%Dann können Sie Ihre Fehlerhandler wie folgt schreiben.
%Vor%Von hier eingeklemmt . Noch ein Tipp: Verwenden Sie das kostenlose Add-In MZTools , um diese Fehlerhandler automatisch hinzuzufügen. Für Code in Produktionsqualität können Sie weiter gehen und in jeder Routine einen Fehlerhandler einfügen, um ein Ghettostapel-Ablaufverfolgung . Sie können die Fehler auch sofort in jedem Fehlerhandler protokollieren.
EDIT: Ant hat korrekt darauf hingewiesen, dass On Error Goto -1
ein VB.Net ist Anweisung und ist in VB6 nicht gültig.
BEARBEITEN: Arvo und OneNerd haben Antworten mit einigen interessanten Diskussionen über die Emulation von Teardown Blocks in der VB6 Fehlerbehandlung geschrieben. Die Diskussion in diese Frage lohnt sich ebenfalls ein Blick.
Es gibt eine klare und einfache Möglichkeit, den Fehlerstatus zurückzusetzen - verwenden Sie das Schlüsselwort Resume. Es gibt drei Möglichkeiten:
%Vor%Fortsetzen setzt die Ausführung bei fehlerhafter Zeile fort, Fortsetzen Weiter in der nächsten Zeile und am wenigsten gesprochenes Fortsetzen Die Beschriftung wird bei Etikett fortgesetzt. Sehr nützlich, um Try-Catch-finally-ähnliche Konstrukte in VB6 zu erstellen. Aus OneNerd ausgeliehen und modifiziert:
%Vor%Simple Err.Clear hilft nicht, wenn ein Folgefehler im Finally-Block auftritt; Resume Schließlich wird der interne Fehlerzustand zurückgesetzt.
Es gibt ein praktisches Rechtsklick-Menü, mit dem Sie die Fehlerbehandlung ein- und ausschalten können. Klicken Sie mit der rechten Maustaste auf ein Code-Fenster und wählen Sie Toggle, dann können Sie "Break on all errors" auswählen. Dies hat den Effekt, dass alle Ihre "On Error" -Anweisungen deaktiviert werden.
Folgendes mache ich:
Aktivieren Sie zuerst die Fehlerbehandlung, falls erforderlich, in Ihrem Sub Main () oder Sub Form_Load () Sub:
%Vor%Jetzt werden Fehler aktiviert.
Als Nächstes verwenden Sie die Befehle Bei Fehler Fortsetzen neben und Bei Fehler GoTo {label} in Kombination mit dem Objekt Err . Hier ist ein Beispiel für die Emulation eines try / catch / finally:
%Vor%Sollte sein, was du willst ... Es sollte den Fehler auf den geworfenen bringen, und wahrscheinlich wiederum bis zum RTL abwickeln ...
Es ist lange her, aber ich bin mir ziemlich sicher, dass du das willst.
%Vor%wird einfach mit der nächsten Anweisung fortfahren, also brauchen Sie eine Menge
%Vor%Anweisungen in Ihrem Code, wo Fehler auftreten können ...
Sie müssen LarryF zustimmen, Bei Fehler Goto 0 sollte die explizite Fehlerbehandlung deaktivieren, die durch Bei Fehler Resume Next aktiviert wurde. Funktionen und Subroutinen haben dafür jedoch ihren eigenen Geltungsbereich. Von Dr. med., Dr. Scripto bei Microsoft :
Putting On Error Resume Weiter bei der Anfang des Skripts, wie wir oft tun, macht es für den gesamten Körper gelten des Skripts. Aber wie wir sehen werden später Beispiele, sein Umfang nicht enthalten Funktionen oder Unterprogramme. Ob Sie möchten Fehler innerhalb eines Funktion oder Unterprogramm, müssen Sie auch Fügen Sie On Error Resume Next in jedem ein von ihnen vor der Überprüfung der Err Objekt.
Sie können die Fehlerbehandlung mit deaktivieren Auf Fehler GoTo 0. So ist es möglich zu Schalten Sie die Fehlerbehandlung mit On Error ein Resume Next, bevor Sie möchten Überprüfen Sie das Err-Objekt und deaktivieren Sie es danach mit On Error GoTo 0.
Tags und Links error-handling vb6