10. Обработка ошибок.
Условные операторы.
В этом разделе Вы познакомитесь с концепцией обработки ошибок. Кроме того, Вам станет известна важная часть языка, называемая условными операторами.
В конце прошлого подраздела мы столкнулись с ситуацией, когда при некорректном действии пользователя программа вывела окно-предупреждение и остановилась. Согласитесь, если оставить программе возможность так себя вести, ею никто не станет пользоваться. Один из способов справиться с ситуацией – т.н. обработчик ошибок.
Существует конструкция языка On Error (При Ошибке). Она бывает следующих видов:
-
On Error Resume Next (При Ошибке Продолжить Дальше) – при появлении ошибки она игнорируется и выполнение продолжается. Вы должны очень хорошо предвидеть виды ситуаций, могущих вызвать ошибку, если упустите какую-то ситуацию, возможен крах системы. Но в большинстве случаев этот способ подходит.
-
On Error Goto <метка> (При Ошибке ПерейтиНа <метку>) – при ошибке программа переносит выполнение на <метку>, после которой следует конструкция, обрабатывающая ошибку.
-
On Error Goto 0 (При Ошибке ПерейтиНа Ноль) – отмена обработки ошибок.
-
Все конструкции On Error действуют в пределах процедуры, в которой находятся (о процедурах Вы узнаете далее).
Другой способ выявления ошибок – проверка т.н. системного объекта Err (от англ. Err[or] – Ошибка). Этот объект имеет свойства Number (Номер) и Description (Описание), учитывая которые вы можете так или иначе влиять на ситуацию. Этот метод сложнее, но гибче. Впоследствии мы познакомимся с конструкциями VB, которые позволят Вам пользоваться объектом Err.
В нашем случае применим способ игнорирования ошибок – очевидно, что ошибки будут возникать только из-за недопустимых действий с БД, и эти ошибки имеют нефатальный характер.
В начало обработчика события cmdUpdate_Click внесите строку:
On Error Resume Next
Код примет вид:
Private Sub cmdUpdate_Click()
On Error Resume Next
dtPhoneBook.Recordset.Update
End Sub
-
Запустите программу.
-
Добавьте запись кнопкой «Добавить».
-
Внесите значения в текстовые поля.
-
Щелкните кнопку «Обновить».
Как видите, без перехода на другую строку содержимое сетки обновилось (и содержимое БД тоже).
Остался обработчик события cmdDelete_Click. Здесь ситуация немного сложнее.
В обработчик cmdDelete_Click добавьте строку:
dtPhoneBook.Recordset.Delete
Но при удалении записи указатель объекта Recordset не сможет переместиться самостоятельно и будет указывать на уже удаленную, несуществующую запись, это неверно.
dtPhoneBook.Recordset.MoveNext
Сразу следует предусмотреть ситуацию удаления последней записи в наборе – т.е., если перемещать указатель некуда.
VB позволяет производить проверку условия с помощью слов If(Если), Then (То), Else (Иначе).
If <условие> Then
<действия, если условие выполнено>
Else
<действие, если условие не выполнено>
End If
Возможны разновидности этой конструкции:
If <условие> Then <действие>
If <условие> Then
<действия, если условие выполнено>
ElseIf <другое условие> Then
<действие, если другое условие выполнено>
.
.
.
Else
<действие, если ни одно из условий не выполнено>
End If
-
В случае, если проверяется, приняло ли какое-то свойство значение из списка возможных, применяется конструкция:
Select Case <свойство>
Case <значение1>
<действия при значении1>
Case <значение2>
<действия при значении2>
Case <значение3>
<действия при значении3>
.
.
.
CaseElse
<действия при других значениях>
End Select
В нашем случае будем производить проверку, не достигли ли мы конца набора записей, и, если достигли, то будем перемещать указатель набора.
В обработчик события cmdDelete_Click внесите строки:
If dtPhoneBook.Recordset.EOF Then
End If
Это – заготовка конструкции проверки условия.
Если выполняется условие dtPhoneBook.Recordset.EOF, То
End If
Свойство EOF (КонецНабора) может принимать два значения: True (Истина) и False (Ложь). Если достигается конец набора (условие выполняется), то свойство принимает значение True, в других случаях его значение равно False.
-
Значения True(Правда) и False (Ложь) – т.н. логические или булевские величины. Они применяются в логических операциях при проверке условий. VB имеет несколько слов-операторов для обработки логических условий.
-
Вышеуказанные строки можно написать так:
If dtPhoneBook.Recordset.EOF = True Then
.
.
.
End If
Это – равнозначные способы написания. Первый способ проще, но второй – нагляднее, выбирайте сами.
Теперь определите действие, которое будет происходить в ответ на выход указателя за пределы набора (а свойство КонецНабора – указывает не на последнюю запись, а на участок после последней записи).
dtPhoneBook.Recordset.MoveLast
Private Sub cmdDelete_Click()
dtPhoneBook.Recordset.Delete
If dtPhoneBook.Recordset.EOF Then
dtPhoneBook.Recordset.MoveLast
End If
End Sub
Внесите в код соответствующие строки.
Все? Нет, мы упустили случай удаления последней и единственной записи в наборе, т.е., когда набор остается пуст. Можно проверять количество записей в наборе, и, если осталась последняя запись, запрещать удаление, но мы сделаем проще – проигнорируем ошибку.
On Error Resume Next
Все работает!
Хитрость:
Напишите так:
Private Sub cmdDelete_Click()
On Error Resume Next
With dtPhoneBook.Recordset
.Delete
If .EOF Then
.MoveLast
End If
End With
End Sub
Этот код действует совершенно так же, как и вышеописанный.
Слово With (С, Совместно) заставляет VB считать, что все действия производятся с объектом, чье имя стоит за With (здесь - dtPhoneBook.Recordset), и Вы можете сразу «дописывать» фразу, начиная ее с точки.
-
Конструкция With должна быть внутри процедуры (т.е., на другие процедуры она не распространяется), и обязательно должна завершаться строкой End With.
-
Кроме того, такое написание кода, как правило, работает быстрее.
Применяйте конструкцию With только тогда, когда обращение к одному и тому же объекту встречается не менее 3-5 раз подряд.
Проверьте, как работает Ваша программа.
Не забудьте сохранить результаты.
Вопросы
-
Какие способы обработки ошибок Вам известны?
-
Какие условные операторы Вам известны? В каких случаях они применяются?
Задания
-
Обязательно добавьте комментарии к созданной Вами форме!
-
Законспектируйте раздел.
-
Так же. как и форму frmPhoneBook, создайте вторую форму для работы с базой данных – форму frmDiary. Внешний вид этой формы и составляющие ее компоненты совершенно аналогичны уже созданной «Телефонной книжке», другими будут имена элментов управления и надписи на метках. Естественно, форма будет подключена к другой таблице БД:
Элемент управления |
Свойства |
dtDiary |
DataBaseName = C:\VB Begin\Organizer.mdb
RecordSource = Diary |
dbgrDiary |
DataSource = dtDiary |
txtNote |
DataSource = dtDiary
DataField = Note |
txtDate |
DataSource = dtDiary
DataField = Dates |
Соответственно следует изменить код формы, поменяв имена объектов там, где они отличаются от имен формы frmPhoneBook.
В остальном эти формы одинаковы.
Сохраните и эту форму в рабочем каталоге проекта.
|