Программирование >>  Проектирование интерфейса пользователя 

1 ... 97 98 99 [ 100 ] 101 102 103 ... 153


Существует, по меньшей мере, две ситуации, оправдывающие практическое применение объекта Err: в первом случае полезно исследовать свойства Err после возникновения ошибки, а во втором с помощью метода Raise удобно сгенерировать сообщение об ошибке, чтобы дать пользователю информацию о характере проблемы. В

листинге 18.3 мы обратились к Raise, чтобы предоставить пользователю данные об

ошибке, для которой специальные средства обработки не предусмотрены (речь идет обо всех ошибках, кроме ошибки с номером 53).

Применение обработчика ошибок для проверки данных, вводимых пользователем

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

стандартную функцию преобразования типов, а наряду с ней - конструкцию обработчика, позволяющую избежать ошибок, если информация не поддается преобразованию. Просмотрите текст листинга 18.4.

Листинг 18.4. Пример использования обработчика в задаче определения признака високосного года

Sub Test ( )

MsqBox IsLeapYear( 2001 End Sub

3 4: 5 6: 7 : 8: 9:

10 : 11 12:

14:EXCEPT:

15: IsLeapYear

17:End Function

Function IsLeapYear Val Year As Integer ) As Boolean

On Error GoTo EXCEP

IsLeapYear = True Dim Abate As Date Abate = CDate( 2/29/ & Year ) Exit Function

False

I Листинг 18.4 демонстрирует прием (правда, близкий к трюкачеству) оп-l ределения того, является ли указанный год високосным. (Строки 1-3 содержат данные тестовой процедуры.) В строке 7 задается заголовок обработчика ошибок. Команда строки 8, свидетельствующая о неисчерпаемом оптимизме программиста, присваивает возвращаемой переменной значение True. В строке 11 объявляется вспомогательная переменная типа Date. Далее из литерала, задающего дату 29 февраля и значения тестируемого года, формируется строка, которая передается встроенной функции CDate. Эта функция предпринимает попытку преобразования значе-



ния типа string в Date. Если преобразование осуществляется безошибочно, выполнение функции завершается. В противном случае управление передается на метку EXCEPT, выполняется инструкция обработчика ошибки, и функция возвращает значение False.

В числе встроенных функций VBA имеется функция IsDate типа Boolean, выполняющая анализ корректности даты и возвращающая значение True, если дата верна, и False - в противном случае.

Конечно, помимо продолжительности года, следует проверять корректность значеНИИ месяца и числа. Существует и готовый алгоритм проверки того, является ли год високосным. Мне удалось ознакомиться с книгой Джека Пэдама (Jack Purdum) С Programmers Toolkit 1989 года издания и преобразовать функцию с языка С на VBA. Листинг 18.5 содержит реализацию алгоритма определения признака високосного года на языке VBA.

Листинг 18.5. Функция проверки признака високосного года

1: Function г {ByVal Year As Integer) As Boolean

2: LeapYear = (Year Mod 4 = 0) And ( (Year Mod 100 <> 0) Or

(Year Mod 400 = 0) )

3 : End Function

Високосным считается год, значение которого нацело делится на четыре и четыреста, - за исключением тех, которые делятся на сто. Наверняка аналогичный код присутствует и в недрах функции CDate.

Проблема экономии ресурсов компьютера

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

Чтобы решить задачу экономии ресурсов, можно воспользоваться механизмом создания обработчика ошибок - при условии, что его тело, которое должно выполняться всегда, будет содержать необходимые инструкции освобождения занятых ресурсов. VBA не предлагает специальных средств поддержки подобного подхода, но их легко построить. Хотя программа, написанная на VBA, способна истощить ресурсы памяти с меньшей долей вероятности, нежели аналогичное приложение, созданное, скажем, на языке C++, встречаются ситуации, когда необходимо проявлять особое внимание относительно корректного закрытия ранее открытых файлов или баз данных.

Блок строк кода, решающих задачу защиты ресурсов компьютера от истощения,

создается как тело обычного обработчика ошибок. Но поскольку он должен выполняться всегда, инструкцию Exit, препятствующую переходу на метку обработчика, следует исключить. Листинг 18.6 демонстрирует пример обработчика, выполняющего закрытие файла в любом случае - независимо от того, произошла ошибка или нет.



Листинг 18.6. Пример использования обработчика ошибок рующего экономию ограниченных ресурсов компьютера

1 : 2 3

8 : 9 10: 11: 12: 13 :

On Error GoTo FINALLY Dim Handle As Double Handle = FreeFile

Open c: \au.toexec.bat For Input As #Handle

Dim Dine As String

Do While (EOF(Handle) = False)

Dine Input #Handle, Dine

Debug.Print Dine

Deep FINALLY:

Close #Handle End Sub


Ресурсосберегающие блоки не слишком часто применяются в программах на Visual Basic. Программисты, работающие с языками струкг>рированной обработки ошибок, используют эту технику чаще. Компания Microsoft обеспечила структурированную обработку ошибок в Visual Basic.NET, некоторые элементы этой технологии реализованы и в VBA.

Тот факт, что данный простой метод требует поддерживать только один обработчик ошибок, является следствием разделения задач. Можно встретить и сложные процедуры, однако это не означает, что они хороши.

I Строка 2 задает заголовок обработчика ошибок. В этом примере речь I идет об обеспечении гарантий закрытия файла. В строках 3-4 объявляется переменная для хранения номера открытого файла и в результате вызова функции FreeFile этот номер резервируется операционной системой. В строке 5 файл открывается. Строки 6-10 содержат ряд инструкций по обработке данных из файла (отдельные строки файла считывают-

ся и выводятся в окне Immediate). Команда строки 12, закрывающая файл, выполняется всегда (обратите внимание - инструкция Exit Sub

отсутствует), поэтому выделенный файловый ресурс будет обязательно освобожден и возвращен операционной системе. В данном случае при

именовании метки (FINALLY) мы придерживались иного соглашения -

чтобы легко отличить обработчик ошибки, выполняющий дополнительную задачу обеспечения экономии ресурсов компьютера, от всех других.

Применение объекта Debug

На страницах нашей книги мы уже неоднократно ссылались на объект Debug. Он относится к глобальным ресурсам программы и поэтому существует в единственном экземпляре. Объект Debug особенно полезен на этапе проектирования и отладки приложения. Он содержит два метода - Print и Assert; других атрибутов в его составе нет. Метод Print позволяет отобразить содержимое элемента данных в окне Immediate, а верификатор Assert дает возможность приостановить выполнение программы в том случае, если выражение типа Boolean, переданное ему в качестве параметра, дает в результате вычисления значение False.



1 ... 97 98 99 [ 100 ] 101 102 103 ... 153

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика