Wie kann die Standardfehlerbehandlung in VB6 wieder aktiviert werden?

8

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)?

    
Fred Hamilton 10.04.2009, 01:15
quelle

8 Antworten

10

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.

    
MarkJ 15.04.2009, 17:11
quelle
3

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.

    
Arvo 15.04.2009 21:02
quelle
1

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.

    
Alex Warren 10.04.2009 08:31
quelle
1

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%     
OneNerd 10.04.2009 14:01
quelle
0

/ Extras / Optionen / Allgemein / Fehlerbehandlung

    
dkretz 10.04.2009 01:19
quelle
0
%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 ...

    
LarryF 10.04.2009 01:57
quelle
0

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.

    
brism 10.04.2009 08:48
quelle
0

Es gibt kein "On Error GoTo -1", also habe ich keine Ahnung, wo Sie das haben.

VB6 Exception Handling wird im Handbuch sehr ausführlich behandelt.

    
Bob 11.04.2009 13:36
quelle

Tags und Links