Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Kак мне правильно вызвать исключение ... ... а потом отловить его? 
:(
    Опции темы
neutrino
  Дата 9.1.2003, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



Приветствую, господа!
   У меня вопрос: как мне правильно вызвать исключение а потом отловить его? Я пробовал так: если пароль занесли неправильный, я вызываю исключение ошибки деления на нуль (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


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Grey
Дата 9.1.2003, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 25.3.2002

Репутация: нет
Всего: нет



В 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

Код я не компилировал, так что могут быть опечатки.
В общем разберешься  :)
PM MAIL   Вверх
neutrino
Дата 9.1.2003, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



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


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
neutrino
Дата 12.1.2003, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Gothic soul
****


Профиль
Группа: Модератор
Сообщений: 3041
Регистрация: 25.3.2002
Где: Верхняя Галилея, Кармиэль

Репутация: нет
Всего: 62



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

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


--------------------
The truth comes from within ...

Покойся с миром, Vit 
PM MAIL WWW ICQ Skype GTalk   Вверх
Grey
Дата 14.1.2003, 04:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 25.3.2002

Репутация: нет
Всего: нет



Сразу не догадался что речь про VB.NET :)
То что я написал касается VB6 в VB.NET оставили скорее всего чтоб
упростить перенос кода с VB6. На VB.NET я не писал, писал только на C#.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0684 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.