3 Stimmen

Bessere Möglichkeit, eine Anweisung, die eine Ausnahme ausgelöst hat, in vb.net zu wiederholen

Normalerweise mache ich etwas in dieser Art:

    Dim Attempts = 0
    Try
Retry:
        <Block>
    Catch
        If Attempts < 3 Then
            Attempts += 1
            Thread.Sleep(2000)
            GoTo Retry
        Else
            Throw
        End If
    End Try

Das sieht für mich wirklich nicht gut aus, aber ich kenne keinen besseren Weg, es zu tun.

3voto

Alex Essilfie Punkte 11993

Sie könnten auch Folgendes versuchen:

Dim retryCount as Integer = 0
Dim wasSuccessful as Boolean = False

Do
    Try
        <statements>
        'set wasSuccessful if everything was okay.'
        wasSuccessful = True
    Catch
        retryCount +=1
    End Try
Loop Until wasSuccessful = True OrElse retryCount >=5

'check if the statements were unsuccessful'
If Not wasSuccessful Then
    <do something>
End If

Es wird bis zu fünf Mal wiederholt, wenn die Anweisungen nicht erfolgreich waren, aber es wird die Schleife sofort verlassen, wenn die Ausführung der Anweisungen erfolgreich war.

2voto

Jon Skeet Punkte 1325502

Verwenden Sie einfach eine For Schleife oder eine While Schleife anstelle von GoTo auf den Erfolg zu verzichten. Aber ansonsten ist es der richtige Ansatz.

2voto

dr. evil Punkte 26388

Ich denke, das ist eine schlechte Verwendung, ich benutze diese hier, und sie ist viel sauberer.

Dim maxAttempt As Integer = 2

For i As Integer = maxAttempt To 0 Step -1

 Try
    ...
    'Successful Quit
    Exit For

  Catch
     Thread.Sleep(2000)

  End Try
Next

2voto

jeroenh Punkte 25392

Vom Konzept her ist es der richtige Ansatz, obwohl ich nicht jede einzelne Ausnahme abfangen würde, siehe Antwort von @0xA3.

Man könnte es etwas "hübscher" machen, indem man die Wiederholungslogik vom eigentlichen Code trennt, z.B.:

    Sub TryExecute(Of T As Exception)(ByVal nofTries As Integer, 
                                      ByVal anAction As Action)
        For i As Integer = 1 To nofTries - 1
            Try
                anAction()
                Return
            Catch ex As T
                Thread.Sleep(2000)
            End Try
        Next
        ' try one more time, throw if it fails
        anAction()
    End Sub

Das könnte dann wie folgt verwendet werden:

TryExecute(Of SomeExceptionType)(3, Sub()
                                      <Block>
                                    End Sub())

Dies funktioniert nur in VB 10, wenn Sie .Net 3.5 / VB 9 verwenden, müssen Sie dies in einer separaten Funktion

1voto

Dirk Vollmar Punkte 166522

Im Allgemeinen sollte die Wiederholung eines fehlgeschlagenen Versuchs sehr sorgfältig abgewogen werden. Normalerweise ist es viel besser, den Fehler zu melden und den Benutzer entscheiden zu lassen.

Raymond Chen gibt ein schönes Beispiel dafür, wie automatische Wiederholungsversuche zu unerwünschten Problemen führen können, und gibt den Rat, Wiederholungsversuche zu vermeiden:

Lassen Sie die automatischen Wiederholungsversuche langsam angehen

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