9.Проверка данных, вводимых пользователем.ppt
- Количество слайдов: 9
Проверка данных, вводимых пользователем Для проверки данных, вводимых пользователем, вы можете воспользоваться стандартными конструкциями для принятия решений. Давайте рассмотрим пример, в котором пользователь должен ввести свой возраст в ответ на запрос программы. Очевидно, что возраст должен удовлетворять следующим условиям. должен быть числом ограничим введенное значение диапазоном значений для типа данных Byte - то есть введенное значение не может быть больше 256 и меньше 0. скорее всего, он не превысит 100 лет, но, учитывая то, что нашей программой могут пользоваться и долгожители (если верить статистике, некоторые доживают и до 150) переспросим пользователя, уверен ли он в том, что ввел именно это значение, и, если он согласится, примем его. Так же мы ограничим количество возможных попыток для ввода возраста тремя. Добавим в документ Microsoft Word две кнопки. Одну из них назовем cmd_Age. Input и подпишем как Введите ваш возраст, вторую назовем cmd_Inp. Age_Easy и подпишем как Простой ввод возраста. Для проверок создадим несколько пользовательских функций, реализующих их. Такой подход очень удобен, так как позволяет уменьшить количество сложночитаемых вложенных конструкций If-Then. Else и делает работу с программой и ее отладку проще.
1. Функция, которая проверяет, соответствует ли введенное число нашим требованиям: Public Function Is. Good. Num(var_Inp) As Boolean 'Функция возвращает True, если введенное 'число подходит, иначе - False If Is. Numeric(var_Inp) = True _ And Val(var_Inp) > 0 _ And Val(var_Inp) < 255 _ Then Is. Good. Num = True Else Is. Good. Num = False End If End Function
2. Функция, которая проверяет введенное число и возвращает True, если оно больше 100. Public Function Is. More 100(var_Inp) As Boolean 'Функция возвращает True, если введенное число 'более 100 If Val(var_Inp) > 100 Then Is. More 100 = True Else Is. More 100 = False End If End Function
3. Функция, которая возвращает строку с описанием которую допустил пользователь при вводе возраста. Public Function Not. Number(var_Inp) As String 'Определяет, что именно ввел пользователь 'вместо ожидаемого числа и возвращает 'строку для вывода сообщения об ошибке 'Если не выполнится ни одно из условий 'программа выдаст общее сообщение об 'ошибке ввода данных Not. Number = "Ошибка ввода данных" 'Если ей удастся определить тип ошибки 'будет выведено более точное сообщение If var_Inp = "" Then Not. Number = "Вы забыли ввести возраст" End If If Val(var_Inp) < 0 Then Not. Number = "Вы ввели отрицательное число" End If If Is. Numeric(var_Inp) = False Then Not. Number = "Вы ввели не число" End If If Val(var_Inp) > 255 Then Not. Number = "Вы ввели слишком большое число" End If End. ошибки,
4. Текст программы, которая использует вышеописанные проверки введенного пользователем возраста. Private Sub cmd_Age. Input_Click() 'Переменная для ввода пользователм Dim str_Inp 'Сюда запишем возраст после проверки Dim num_Age As Byte 'А здесь будем хранить ответ пользователя на 'Вопрос о том, уверен ли он в том, что ему 'Больше 100 лет Dim Is. You. More 100 As Variant 'В этой переменной будем хранить количество 'Неправильных попыток ввода 'Если оно превысит 3 - выходим из программы Dim num_Inp. Try As Byte 'Эта переменная нужна для того, чтобы 'определить, окончен ли опрос пользователя Dim bool_Flag As Boolean bool_Flag = False 'Этот цикл будет длиться до тех пор, 'пока пользователь не введет верное значение 'или пока не совершит максимальное число 'попыток Do str_Inp = Input. Box("Введите ваш возраст") If num_Inp. Try > 3 Then Msg. Box "Вы совершили более 3 ошибок" Exit Sub End If num_Inp. Try = num_Inp. Try + 1 функции для
'Если введенное число подходит If Is. Good. Num(str_Inp) = True Then 'Проверяем - не больше ли оно 100 If Is. More 100(str_Inp) = False Then 'Если не больше - просто устанавливаем 'флаг выхода в True 'и записываем возраст в переменную num_Age bool_Flag = True num_Age = CByte(str_Inp) Else 'Если возраст больше 100 - переспросим Is. You. More 100 = _ Msg. Box("Вам точно больше 100? ", vb. Yes. No) 'Если пользователь не ошибся, 'Установим флаг выхода 'и запишем возраст в num_Age If Is. You. More 100 = vb. Yes Then bool_Flag = True num_Age = CByte(str_Inp) End If Else 'Если пользователь изначально ввел 'неподходяще число, 'сгенерируем с помощью функции Not. Number 'сообщение об ошибке и выведем его Msg. Box (Not. Number(str_Inp)) End If Loop Until bool_Flag = True Msg. Box ("Ваш возраст: " + Str(num_Age)) End Sub
Работа с ошибками времени выполнения Выше мы рассмотрели метод борьбы с ошибками, который заключался в их предотвращении. Но что делать, если в ходе работы программы происходит ошибка, для предотвращения которой ничего сделано не было? В этой ситуации нам поможет перехват и обработка ошибок времени выполнения. Давайте рассмотрим ситуацию, которая гарантированно вызовет ошибку - деление на 0. Добавим в документ Microsoft Word кнопку с именем cmd_Simple. Input, подпишем ее как Отсутствие перехвата ошибок. Напишем простую программу (поместив ее в обработчик события Click кнопки cmd_Simple. Input), которая запрашивает у пользователя два числа, делит одно на другое и выводит результат деления. Следующий код реализует эту функциональность: Dim num_A Dim num_B Dim num_C num_A = Input. Box("Введите число A") num_B = Input. Box("Введите число B") num_C = num_A / num_B Msg. Box ("А, деленое на В равняется: " + Str(num_C))
Чтобы организовать обработку ошибок в программе нужно расположить перед потенциально опасным участком (в нашем случае - перед строкой, где происходит деление) оператор такого вида: On Error Go. To Идентификатор_обработчика Идентификатор обработчика ошибок - это номер или (что предпочтительнее) метка строки в коде текущей процедуры, куда должно быть передано управление при возникновении ошибки. Обработчик ошибок должен находиться в текущей процедуре. Использовать в качестве идентификатора обработчика имя процедуры или функции нельзя В обработчике можно исправить ошибку, предложить пользователю выполнить какие-то действия или просто вывести сообщение об ошибке и завершить работу программы. В обработчике ошибок можно использовать оператор Resume - он возвращает управление в строку, в которой произошла ошибка. После того, как опасный участок программы пройден, обработку ошибок желательно отключить - это можно сделать такой командой: On Error Go. To 0 Так же при обработке ошибок можно пользоваться командой On Error Resume Next Эта команда подавляет вывод сообщения об ошибке, просто
Для работы с ошибками, возникающими при выполнении программы, существует специальный объект - Err. Он содержит информацию об ошибках времени выполнения. У этого объекта есть несколько важнейших методов и свойств Метод Clear очищает информацию об ошибках в объекте Err. Метод Raise позволяет сгенерировать ошибку, указав в качестве параметра ее номер и некоторые другие, необязательные, данные. Эта возможность полезна при тестировании программ, оснащенных обработчиками ошибок, чтобы разработчик мог произвольно генерировать те или иные ошибки. Номера ошибок находятся в диапазоне 0 - 65535. В частности, номера 0 - 512 зарезервированы за системными ошибками, 513 65535 - за ошибками, коды которых пользователь может назначать самостоятельно. Например, для вызова ошибки несоответствия типов переменных (она возникает при попытке записать в числовую переменную строковое значение и в других случаях), которая имеет код 13, достаточно выполнить такую команду: Err. Raise (13) Свойство Number содержит номер ошибки. Обычно этот номер используют для выбора действия в обработчике ошибок. Свойство Description содержит текстовое описание ошибки