Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Выход из блока обработки прерывания по ошибке ⇐ ПредыдущаяСтр 9 из 9 Для выхода из блока обработки ошибки можно ничего не предпринимать, и работа функции будет завершена. Но поскольку с таким образом завершившей свою работу процедурой (или функцией) могут быть связаны другие части кода, видимо, не всегда будет правильно просто отказаться от дальнейшего выполнения процедуры. По крайней мере, надо как-то сообщить о том, что процедура завершилась из-за ошибки. Например, если функция должна была возвратить результат некоторых вычислений, используемый в дальнейших расчетах, то аварийный выход по ошибке мало дает пользы. Ошибка может произойти и при открытии файла. Если не сообщить об этом при выходе из блока обработки ошибки, то найдется такая функция, которая попытается считывать данные из неоткрытого файла. И так далее. Для выхода из блока обработки ошибок предназначен <$I[]оператор Resume > оператор Resume, функции которого приведены в следующей таблице.
Пример использования оператора Resume приведен в листинге 12.4. Это самая простая форма оператора, которая только возвращается к строке кода, где произошла ошибка. По крайней мере, в данном случае этого вполне достаточно, поскольку после правильного ввода числа программа будет работать нормально. Листинг 12.4. Использование в обработчике оператора Resume 1: Private Sub Command1_Click() 2: Dim z, y As Integer 3: On Error GoTo err 4: y = InputBox("Введите число") 5: z = y + 10 6: 7: MsgBox z 8: MsgBox "Спасибо!" 9: Exit Sub 10: 11: err: 12: If err.Number = 13 Then 13: MsgBox ("Просили же Вас ввести число!") 14: Resume 15: End If 16: End Sub В листингах 12.5 и 12.6 приведены примеры использования <$I[]оператор Resume Next > оператора Resume Next. Причем в первом из них выполнется присвоение переменной числа 9999, если пользователь забыл, как вводятся числа. Затем код продолжается со следующей строки (за оператором InputBox). В листинге 12.6 обработчик более лоялен к пользователю, давая ему три попытки для ввода числа. Поэтому здесть используется и оператор Resume, и Resume Next. Для этого в код введен счетчик co, который при загрузке формы (процедура Form_Load) инициализируется значением 1. В блоке обработки ошибок значение счетчика увеличивается на единицу. Как только пользователь использует три попытки ввода числа, но не введет число, оператор Resume Next прекратит пользовательские «мучения», как это делается (только гораздо раньше) в предыдущем листинге. Листинг 12.5. Использование в обработчике оператора Resume Next 1: Private Sub Command1_Click() 2: Dim z, y As Integer 3: On Error GoTo err 4: y = InputBox("Введите число") 5: z = y + 10 6: 7: MsgBox z 8: MsgBox "Спасибо!" 9: Exit Sub 10: 11: err: 12: If err.Number = 13 Then 13: MsgBox ("С Вашего разрешения введем 9999") 14: y = 9999 15: Resume Next 16: End If 17: End Sub Листинг 12.6. Использование в обработчике оператора Resume Next 1: Public co As Integer 2: Private Sub Command1_Click() 3: Dim z, y As Integer 4: On Error GoTo err 5: y = InputBox("Введите число") 6: z = y + 10 7: 8: MsgBox z 9: MsgBox "Спасибо!" 10: Exit Sub 11: 12: err: 13: If err.Number = 13 Then 14: If co = 2 Then 15: MsgBox ("С Вашего разрешения введем 9999") 16: y = 9999 17: Resume Next 18: Else 19: co = co + 1 20: MsgBox ("У Вас осталось " & _ 21: (3 - co) & " попытки") 22: Resume 23: End If 24: End If 25: End Sub 26: 27: Private Sub Form_Load() 28: co = 0 29: End Sub Очень простой пример использования оператора Resume line приведен в следующем листинге. Листинг 12.7. Использование в обработчике оператора Resume line 1: Public co As Integer 2: Private Sub Command1_Click() 3: Dim z, y As Integer 4: On Error GoTo err 5: y = InputBox("Введите число") 6: z = y + 10 7: 8: MsgBox z 9: MsgBox "Спасибо!" 10: Exit Sub 11: 12: err_exit: 13: MsgBox ("Что-то у Вас не получается") 14: Exit Sub 15: 16: err: 17: If err.Number = 13 Then 18: If co = 2 Then 19: Resume err_exit 20: Else 21: co = co + 1 22: MsgBox ("У Вас осталось " & _ 23: (3 - co) & " попытки") 24: Resume 25: End If 26: End If 27: End Sub 28: 29: Private Sub Form_Load() 30: co = 0 31: End Sub В листинге 12.8 блок кода обработки ошибок находится не в той процедуре, где происходит ошибка при делении числа на ноль. Visual Basic при помощи списка вызовов возвращается в процедуру A, поскольку именно там был активизирован обработчик ошибок. Оператор Resume Next инициировал переход к строке кода, которая находится за оператором вызова процедуры B. Листинг 12.8. Обработчик ошибок в одной из процедур 1: Private Sub Command1_Click() 2: Call A 3: End Sub 4: 5: Sub A() 6: On Error GoTo err 7: Call B 8: MsgBox ("В любом случае процедура a завершается") 9: Exit Sub 10: err: 11: MsgBox ("Где-то произошла ошибка!") 12: Resume Next 13: End Sub 14: 15: Sub B() 16: Call C 17: End Sub 18: 19: Sub C() 20: Dim d As Integer 21: d = 1 / 0 22: End Sub
|