我通常做这样的事情:
Dim Attempts = 0
Try
Retry:
<Block>
Catch
If Attempts < 3 Then
Attempts += 1
Thread.Sleep(2000)
GoTo Retry
Else
Throw
End If
End Try
这对我来说真的很糟糕,但我不知道有更好的方法。
答案 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给出了一个很好的例子,说明自动重试可能会导致不必要的问题,并提供避免重试的建议: