Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Kак мне правильно вызвать исключение ...


Автор: neutrino 9.1.2003, 19:54
Приветствую, господа!
   У меня вопрос: как мне правильно вызвать исключение а потом отловить его? Я пробовал так: если пароль занесли неправильный, я вызываю исключение ошибки деления на нуль (11) и пытаюсь его отловить. Но программа не ловит его а показывает ошибку (как в Дельфи "Access violation error at address ...")
Я начал программировать на VB 2 дня назад, так что не обезсудьте. :)

   Function OpenFromFile(ByVal FileName As String) As Boolean
       Dim Stream As StreamReader
       Dim FStream As FileStream
       Dim Idx As Integer
       Dim Result As Boolean = True
       Dim PasswordDialog As PasswordForm

       Try
           FStream = New FileStream(FileName, FileMode.Open, FileAccess.Read)
           Stream = New StreamReader(FStream)
           Password = Decrypt(Stream.ReadLine)
           PasswordDialog = New PasswordForm()
           PasswordDialog.Password = Password
           If PasswordDialog.ShowDialog(Me) = DialogResult.No Then
               Error 11 'Здесь вызываю исключение
           End If
           QwestionCount = Stream.ReadLine()
           ReDim Preserve Qwestions(QwestionCount)
           For Idx = 0 To QwestionCount - 1
               With Qwestions(Idx)
                   .sQwestion = Stream.ReadLine()
                   .sAnswer1 = Stream.ReadLine()
                   .sAnswer2 = Stream.ReadLine()
                   .sAnswer3 = Stream.ReadLine()
                   .sAnswer4 = Stream.ReadLine()
                   .RightAnswer = Val(Stream.ReadLine())
               End With
           Next
Idx
           GotoQwestion(0)
           QwUpDown.Maximum = QwestionCount
       Catch eIO As Exception
           MsgBox("Error reading file: " & eIO.ToString, MsgBoxStyle.Critical, "IO ERROR")
           Result = False
       Catch eFile As Exception
           MsgBox("Error open file: " & eFile.ToString, MsgBoxStyle.Critical, "FILE ERROR")
           Result = False
       Catch e As DivideByZeroException 'Здесь я ловлю
           MsgBox("Access denied! Incorrect password!", MsgBoxStyle.Critical, "Access not allowed")
           Result = False
       Finally
           Stream.Close()
           FStream.Close()
       End Try
       Return
Result
   End Function

Автор: Grey 9.1.2003, 21:33
В VB совсем другая идеалогия обработки ошибок

  Function OpenFromFile(ByVal FileName As String) As Boolean
      Dim Stream As StreamReader
      Dim FStream As FileStream
      Dim Idx As Integer
      Dim Result As Boolean = True
      Dim PasswordDialog As PasswordForm
      Dim bCleanup ' - флаг который показывает освобождались ли ресурсы

      'Try - вместо этого:
      On Error GoTo Failed
          FStream = New FileStream(FileName, FileMode.Open, FileAccess.Read)
          Stream = New StreamReader(FStream)
          Password = Decrypt(Stream.ReadLine)
          PasswordDialog = New PasswordForm()
          PasswordDialog.Password = Password
          If PasswordDialog.ShowDialog(Me) = DialogResult.No Then
              Error 11 'Здесь вызываю исключение
          End If
          QwestionCount = Stream.ReadLine()
          ReDim Preserve Qwestions(QwestionCount)
          For Idx = 0 To QwestionCount - 1
              With Qwestions(Idx)
                  .sQwestion = Stream.ReadLine()
                  .sAnswer1 = Stream.ReadLine()
                  .sAnswer2 = Stream.ReadLine()
                  .sAnswer3 = Stream.ReadLine()
                  .sAnswer4 = Stream.ReadLine()
                  .RightAnswer = Val(Stream.ReadLine())
              End With
          Next Idx
          GotoQwestion(0)
          QwUpDown.Maximum = QwestionCount
          OpenFromFile = Result 'так возвращается результат работы функции
Cleanup: ' - метка для освобождения ресурсов
         bCleanup = True
          Stream.Close()
          FStream.Close()
          if Err.Number <> 0 then GoTo Failed ' - если произошла ошибка          
          exit function
Failed: ' - метка обработчика ошибок здесь можно определить тип
         ' ошибки и обработать ее
         if bCleanup = false then goto Cleanup 'сначала освободим ресурсы
         'здесь можно по номеру ошибки Err.Number соответствующим образом
         'ее обработать
         OpenFromFile = False 'типа все плохо
End Function

Код я не компилировал, так что могут быть опечатки.
В общем разберешься  :)

Автор: neutrino 9.1.2003, 21:42
Спасибо. Дома поразбираюсь. А я как обрадовался, когда увидел в хелпе знакомый блок try...finally. А не, тут оказывается не так как в Delphi.

Автор: neutrino 12.1.2003, 20:46
Тогда вопрос по теме: а зачем реализовывать два пути для отловки исключений в одном языке?

P.S. Я все пишу на VB.NET

Автор: Grey 14.1.2003, 04:18
Сразу не догадался что речь про VB.NET :)
То что я написал касается VB6 в VB.NET оставили скорее всего чтоб
упростить перенос кода с VB6. На VB.NET я не писал, писал только на C#.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)