Как мне использовать Try and Catch, чтобы повторить операцию в VB.Net? - PullRequest
7 голосов
/ 23 июня 2011

Я хотел бы прочитать из файла, и если мне не удастся, позвольте пользователю повторить попытку или иначе сдамся. Пока код выглядит так:

Read_Again:
    Try
        my_stream.Read(buffer, 0, read_len)
    Catch ex As System.IO.IOException
        If MessageBox.Show("try again?") = DialogResult.Retry Then
            GoTo Read_Again
        Else
            Application.Exit() 'just abort, doesn't matter
        End If
    End Try

Мне не нравится Гото, это ужасно. Но я не вижу, как сделать цикл, который охватывает попытки и ловить.

Есть ли лучший способ написать это?

Ответы [ 3 ]

8 голосов
/ 23 июня 2011
Dim retry as Boolean = True
While retry
   Try
      my_stream.Read(buffer, 0, read_len)
      retry = False
   Catch ex As System.IO.IOException
       If MessageBox.Show("try again?") = DialogResult.Retry Then
           retry = True
       Else
           retry = False
           Application.Exit() 'just abort, doesn't matter
       End If
   End Try
End While
3 голосов
/ 24 июня 2011

Я подумал о другом ответе:

Do
    Try
        my_stream.Read(buffer, 0, read_len)
        Exit Do
    Catch ex As System.IO.IOException
        If MessageBox.Show("try again?") <> DialogResult.Retry Then
            Application.Exit() 'just abort, doesn't matter
        End If
    End Try
Loop

Выход в основном замаскирован, однако. Таким образом, мне не нужна другая переменная с большой областью действия.

2 голосов
/ 23 июня 2011

Я бы разделил логику в одну функцию чтения, которая возвращает истину или ложь в зависимости от результата чтения, а затем обработал бы логику повторных попыток вне этого метода.

Например

Function performOneRead(buffer) as Bool
   Try      
     my_stream.Read(buffer, 0, read_len) 
     return true 
   Catch ex As System.IO.IOException    
     return false       
 End Try
End Function


Sub ReadLogics()
 Dim ok as Bool

 While Not Ok
   ok = performOneRead(buffer)
   if not ok AndAlso MessageBox.Show("try again?") <> DialogResult.Retry then Application.Exit(1)
 End While 
end sub
...