Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Выход из блока обработки прерывания по ошибке





Для выхода из блока обработки ошибки можно ничего не предпринимать, и работа функции будет завершена. Но поскольку с таким образом завершившей свою работу процедурой (или функцией) могут быть связаны другие части кода, видимо, не всегда будет правильно просто отказаться от дальнейшего выполнения процедуры. По крайней мере, надо как-то сообщить о том, что процедура завершилась из-за ошибки. Например, если функция должна была возвратить результат некоторых вычислений, используемый в дальнейших расчетах, то аварийный выход по ошибке мало дает пользы. Ошибка может произойти и при открытии файла. Если не сообщить об этом при выходе из блока обработки ошибки, то найдется такая функция, которая попытается считывать данные из неоткрытого файла. И так далее.

Для выхода из блока обработки ошибок предназначен <$I[]оператор Resume > оператор Resume, функции которого приведены в следующей таблице.

Оператор Описание
Resume [0] Выполнение кода возобновляется с того оператора, который вызвал ошибку. Используйте этот оператор для повторения кода после исправления ошибки.
Resume Next Возобновляет выполнение кода с оператора, следующего непосредственно за оператором, вызвавшим ошибку. Если ошибка произошла вне процедуры, содержащей блок обработки ошибок, выполнение кода возобновляется с оператора, находящегося за вызовом процедуры, вызвавшей ошибку, если в этой процедуре нет своего обработчика.
Resume line Возобновляет выполнение кода с указанной метки line. Метка должна находиться в процедуре, содержащей обработчик ошибок.
Err.Raise Number:= number Эмулирует ошибку времени исполнения. Когда этот оператор выполняется внутри блока обработки ошибок, Visual Basic обращается к списку вызовов (последовательность вызова процедур) для поиска другого обработчика.

Пример использования оператора 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

 

 

Date: 2015-08-22; view: 304; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию