更好的方法来重试在vb.net中引发异常的语句

时间:2010-08-19 08:58:45

标签: vb.net exception-handling

我通常做这样的事情:

    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 个答案:

答案 0 :(得分:3)

您还可以尝试以下方法:

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

如果语句不成功,它将重试最多五次,但如果语句的执行成功,它将立即退出循环。

答案 1 :(得分:2)

只需使用For循环或While循环而非GoTo,即可取得成功。但除此之外,这是正确的方法。

答案 2 :(得分:2)

我认为这是一个糟糕的用法,我使用这个,它更清洁。

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 

答案 3 :(得分:2)

从概念上讲,这是正确的方法,虽然我不会抓住每一个例外,但请看@ 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,则需要在单独的函数中将其分开

答案 4 :(得分:1)

一般情况下,应该非常仔细地考虑重试失败的内容。通常,报告错误并让用户决定要好得多。

Raymond Chen给出了一个很好的例子,说明自动重试可能会导致不必要的问题,并提供避免重试的建议:

  

<强> Take it easy on the automatic retries