4 Stimmen

Wie behandelt man Fehler in Fehlerbehandlungsprogrammen in VB6?

Ich treffe häufig auf diese Situation in meinen VB6-Anwendungen

Private Sub DoSomething

  On Error Goto err1

  Call ProcessLargeBatch1
  Call ProcessLargeBatch2
  '... more ...'

  Exit Sub

err1:
  Call Cleanup 'Specific for DoSomething'
  Call HandleError 'General error handling: Logging, message box, ...'

End Sub

Die Bereinigungsprozedur macht manchmal Aktionen rückgängig, rollt eine Transaktion zurück, löscht temporäre Dateien und so weiter. In den meisten Fällen kann dieser Vorgang auch fehlschlagen.

Was muss ich in diesem Fall tun? Ich füge eine On Error Resume Next in den Error-Handler einfügen, aber das löscht die bestehende Err Objekt. Hinzufügen eines Fehlerhandlers zu Cleanup hat das gleiche Problem.

Wie lässt sich am besten sicherstellen, dass die ursprünglichen Fehler weiterhin verarbeitet/protokolliert werden?

EDIT : Ein zusätzliches Problem ist, dass ich den Benutzer auch über den Fehler informieren möchte. Manchmal ist es wichtig, dass die Bereinigung schnell erfolgt, und ich möchte nicht, dass das Meldungsfeld die Anwendung für eine lange Zeit blockiert und die Bereinigung durchführt, nachdem der Benutzer den Fehler bestätigt hat.

4voto

Patrick McDonald Punkte 61826

Lesen Sie zunächst alle Informationen aus dem Err-Objekt aus, die Sie benötigen, d. h. Nummer, Beschreibung usw., löschen Sie dann den Fehler und tun Sie, was Sie wollen.

Ändern Sie die Art und Weise, wie Sie den Benutzer darüber informieren, dass er die zwischengespeicherten Werte verwenden soll, und nicht das Err-Objekt selbst.

3voto

RS Conley Punkte 7136

Ihrem Beispiel zufolge führen Sie die Bereinigung ordnungsgemäß durch. Ihr HandleError sollte nur den Fehler protokollieren und keine Benutzeroberfläche erstellen. Die UI wird auf der Formularebene behandelt.

Was Sie tun müssen, wenn ein Fehler auftritt, ist

  1. Aufräumen
  2. Den Fehler protokollieren
  3. Den Fehler über Err.Raise erneut auslösen

Dies wird sich im Aufrufstapel bis zu dem Ereignis hocharbeiten, das den ursprünglichen Code aufgerufen hat. Dann wird die Sequenz zu

  1. Aufräumen
  2. Den Fehler protokollieren
  3. Anzeige des Dialogs zur Fehlerbenachrichtigung

Beachten Sie, dass Ihre Fehlerprotokollierung insofern intelligent sein kann, als nachfolgende Protokolle desselben Fehlers einfach zum aufgezeichneten Aufrufstapel hinzugefügt werden können.

Sie wollen sicherstellen, dass JEDES Ereignis einen Fehler-Handler hat. Nicht jede Prozedur braucht einen, aber definitiv jedes Ereignis. Unbehandelte Fehler in einem Ereignis führen dazu, dass eine VB6-Anwendung unerwartet beendet wird.

2voto

Mike Woodhouse Punkte 50241

Wenn ich alle Fehler an einer Stelle behandeln kann, füge ich sie normalerweise in eine Struktur wie diese ein:

Public Sub SubThatShouldHandleErrors()
Const ROUTINE_NAME = "SubThatShouldHandleErrors"
On Error Goto Catch

    ' "normal" processing here...

Finally:
    ' non-error case falls through to here
    ' perform clean-up that must happen even when an error occurred
    On Error Goto 0 ' reset: not really needed any more, but it makes me feel more comfortable
    Exit Sub

Catch:
    ' Error handling here, I may have logging that uses ROUTINE_NAME
    Resume Finally

End Sub

Wenn ich mehr als einen Error-Handler benötige, werde ich mich bemühen, meinen Code so umzustrukturieren, dass das nicht der Fall ist, aber wenn es unbedingt notwendig ist, werde ich einen eigenen Handler schreiben; meine Vorlage ist nur eine Richtlinie.

1voto

Charles Graham Punkte 23517

Protokollieren Sie zunächst Ihren Fehler. Führen Sie dann ein On Error Resume Next durch. Lassen Sie Ihre Bereinigung in Methoden kapseln, die ihre eigene Fehlerbehandlung haben. Das sollte Ihre beste Wahl sein.

0voto

Svante Svenson Punkte 12222

Ich mag Fehlerbehandlungsprogramme wirklich nicht. Dies ist, was ich tue;

  • Erstellen Sie eine Fehlerklasse oder ein Fehlermodul, die bzw. das alle Eigenschaften enthält, die das eingebaute Objekt enthält, sowie eine CopyError-Methode, die diese Eigenschaften aus dem Err-Objekt füllt.
  • Achten Sie auf Fehler, wo sie auftreten können:

.

' lots of code that will probably work
On Error Resume Next
Open "c:\filethatdoesntexist.txt" For Input As #1
Error.CopyError
On Error Goto 0
Select Case Error.Number
    Case 53'File doesn't exist
        ' handle that error here
    Case 0
        ' no error
    Case Else
        ' Just throw the error on
        Err.Raise Error.Number, Error.Description, ...
End Select
' more code that will probably work

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X