Лучший способ повторить утверждение, которое вызвало исключение в vb.net - PullRequest
3 голосов
/ 19 августа 2010

Я обычно делаю что-то вроде этого:

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

Это действительно плохо для меня, но я не знаю лучшего способа сделать это.

Ответы [ 5 ]

3 голосов
/ 19 августа 2010

Вы также можете попробовать следующее:

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

Он будет повторяться до пяти раз, если операторы не были успешными, но сразу же завершит цикл, если выполнение операторов было успешным.

2 голосов
/ 19 августа 2010

Концептуально это правильный подход, хотя я не поймал бы каждое исключение, см. Ответ @ 0xA3.

Вы можете сделать его немного «красивее», отделив логику повторения от реального кодаНапример:

    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

Что может быть использовано следующим образом:

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

Это будет работать только в VB 10, если вы используете .Net 3.5 / VB 9, вам нужноотделить это в отдельной функции

2 голосов
/ 19 августа 2010

Я думаю, что это плохое использование, я использую это, и это намного чище.

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 
2 голосов
/ 19 августа 2010

Просто используйте цикл For или цикл While вместо GoTo, что приведет к успеху. Но кроме этого, это правильный подход.

1 голос
/ 19 августа 2010

В общем, повторная попытка чего-то, что не удалось, должна рассматриваться очень осторожно. Обычно гораздо лучше сообщить об ошибке и позволить пользователю принять решение.

Раймонд Чен приводит хороший пример того, как автоматические повторные попытки могут привести к нежелательным проблемам, и дает совет избегать повторных попыток:

Полегче на автоматических повторных попытках

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...