Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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#. |