Файл: Освой самостоятельно программирование для MS Access 2002 за 24 часа [П.Киммел].pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 21.10.2020

Просмотров: 7885

Скачиваний: 25

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Это означает, что не нужно тратить время на предварительный анализ потенци-

ально опасных случаев и написание специализированных обработчиков — теперь ваш
код способен справиться с любыми ошибками; достаточно сформулировать и зафик-
сировать те действия, которые программа должна выполнять в аварийных ситуациях
по умолчанию. Обычное решение состоит в попытке вернуть программу в то состоя-
ние, в котором она пребывала непосредственно перед возникновением исключения.
Хотя при этом не гарантируется устранение ошибки как таковой, подобная мера спо-
собна предотвратить "зависание" программы или сбой компьютера.

Помимо мер, предусматривающих поведение программы по умолчанию, обработ-

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

Если код не в состоянии полностью справиться с возникшей проблемой, вы как

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

Один из видов деятельности, которой занимается фирма

 Software

Conceptions,

 состоит в тестировании и оценке программного обеспе-

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

домо низкую оценку. Если же в программе используется технология

обработки исключений, ей — при прочих равных условиях — дается
более высокая оценка. Код, в котором применяются обработчики
исключительных ситуаций, наверняка более "живучий".

Многие факторы, составляющие понятие хорошей программы (и об этом

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

Способность "отлавливать" все без исключения ошибки, возможность задания

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

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

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

Впрочем, вынужден вас огорчить — VBA все еще не обладает возможностями пол-

ноценной поддержки механизмов обработки исключительных ситуаций. Но есть и хо-
рошая новость: в языке программирования Visual Basic (и, как следствие, в VBA) из-
начально реализована весьма неплохая схема "отлова" ошибок, которая, в некотором

весьма напоминает классические способы обработки исключений.

Visual Basic.NET поддерживает структурированную обработку исключений.

В следующей части этой главы речь пойдет о самых эффективных приемах борьбы

с ошибками, поддерживаемых в VBA. Приведенный ниже материал поможет вам в
создании образцов надежного, устойчивого и "живучего" кода.

 час. Обработка ошибок во время выполнения программы

315


background image

Как строить обработчики ошибок

Будем считать (в данном случае мы можем себе это позволить) понятия обработчика

ошибок и обработчика исключений равнозначными. Microsoft в контексте темы про-
граммирования на VBA избегает употребления словосочетания

 исключений,

поэтому так поступим и мы. (Подозреваю, что не только я, но и специалисты Microsoft
понимают, что средства борьбы с ошибками, реализованные в

 нельзя назвать пол-

ноценным механизмом обработки исключительных ситуаций.) Сейчас в документации и

литературе по VBA принят термин

 обработчик ошибок,

 так что мы вынуждены подчи-

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

Блок обработчика ошибок состоит из заголовка и тела. Строка заголовка должна распо-

лагаться непосредственно перед той областью текста функции или процедуры, в которой

существует наибольшая опасность возникновения ошибок. Тело обработчика всегда распо-

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

(если не подразумевается иное) только в случае ее действительного возникновения.

Конструкция заголовка обработчика ошибок

Заголовок обработчика ошибок задается посредством выражения On Er-

ror GoTo. Его синтаксис приведен ниже.

On Error GoTo Метка

О

В ходе дальнейшего повествования, употребляя слово "функция",

имеем в виду как подлинные функции, так и процедуры (подпрог-
раммы) или методы классов, при условии, если различия между ними в
контексте обсуждения не существенны.

Чтобы задать заголовок обработчика ошибок, вам необходимо буквально воспроиз-

вести словосочетание On Error GOTO и сопров'одить его наименованием метки, ука-
зывающей на строку кода, с которой начинается тело обработчика. Тело всегда раз-

мещается в конце функции. Листинг 18.1 содержит пример со строками заголовка об-
работчика и его метки.

Листинг 18.1. Пример пустого обработчика ошибок

 Sub

 )

2: On Error GoTo EXCEPT

4: End Sub

Чаще всего я даю меткам имя EXCEPT (исключение) — это "исключает"

тяжкие раздумья по поводу поиска названий, соответствующих конкрет-

ной ситуации. Имя метки должно быть уникальным в пределах функции.

Если та же функция содержит и другие обработчики ошибок, можно

предложить использовать названия типа ЕХСЕРТ1, ЕХСЕРТ2 и т.д.

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

316

Часть VI. Работа над ошибками


background image

Строка 2 листинга

 содержит заголовок обработчика ошибок, указы-

вающий на метку EXCEPT. В строке 3 размещается собственно метка. Об-

ратите внимание на использование в названии метки символа двоеточия

 это обязательная часть конструкции метки, ее отличительный при-

знак. (В заголовке обработчика двоеточие не употребляется!) После вы-

полнения инструкции строки 2 любая ошибка, возникающая далее, за-

ставит программу "перепрыгнуть" на строку тела обработчика, следую-

щую за указанной меткой.

Правила именования меток

Рекомендуется вводить названия меток символами верхнего регистра. В таком слу-

чае их легче распознавать в теле функций. Впрочем, это только совет. Вы вольны на-

зывать метки так, как хотите, но помните о необходимости быть последовательным в

своих действиях — характерный (хотя, разумеется, не единственный и не самый глав-

ный) признак профессионализма. Следуйте принятым правилам неукоснительно — и

ваша работа станет продвигаться вперед значительно быстрее.

Не забывайте об инструкции Exit

Листинг 18.1 содержит один недостаток. Если после строки 2 вы вставите код, ко-

торый планируете тестировать (вы обязаны это сделать — иначе процедура лишена

смысла), то тело обработчика ошибки, как и остальные строки, будет выполняться

всегда. Листинг 18.2 демонстрирует исправленную версию процедуры Test, снабжен-

ную дополнительной командой Exit Sub.

Листинг 18.2. Пример использования инструкции Exit Sub

 Sub Test ( )
 On Error GoTo EXCEPT

3 : Exit Sub
4: EXCEPT:
5 : End Sub

I Теперь все в порядке. При создании обработчика ошибок имеет смысл

| ввести в текст все эти строки (содержащие заголовок, команду Exit и

метку) сразу, чтобы ничего не упустить. Если вы забудете вставить строку

с Exit, программа, дойдя до метки, начнет выполнять инструкции тела

обработчика и вместо устранения ошибок может вызвать их появление.

Конкретный вид команды Exit зависит от типа программного блока, в контексте

которого она употребляется. Если блок представляет собой процедуру

вы должны написать Exit Sub. Для функций используется конструкция Exit Func-

tion, а для методов Property — Exit Property. (Подробнее о методах Property

см. главу "21-й час. Основы программирования

Чтобы процедура листинга 18.2 смогла выполнять что-то полезное, необходимо

вставить между строками 2 и 3 функциональный код, а после строки 4 — код тела об-

работчика ошибок.

Общие правила создания обработчиков

ошибок

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

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

18-й час. Обработка ошибок во время выполнения программы

317


background image

Действия, предусмотренные VBA по умолчанию, предполагают отображение окна

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

ли вы не можете придумать ничего лучшего по сравнению с операциями, выполняемы-

ми по умолчанию, не создавайте обработчик ошибок. Исключением может служить не-

обходимость документирования сообщений об ошибках в журнальном файле.

Иногда бывает полезным, наряду с собственными творческими достижениями, ис-

пользовать и стандартные операции обработки ошибок. Но действия, предпринимае-

мые по умолчанию, выполняются только в случае отсутствия обработчика. Если обра-

ботчик создан, а вы хотели бы еще и имитировать стандартные операции, достаточно

обратиться к объекту Err, который содержит информацию о возникшей ошибке

(подробнее об этом см. раздел "Использование объектов класса Err" данной главы).

Очистка состояния обработчика ошибок

Область действия обработчика ошибок ограничена пределами функции. Если вы

построили обработчик, он будет "работать" только внутри текущей функции. При не-

обходимости очистки состояния обработчика ошибок на уровне функции следует вы-

полнить команду
On Error GoTo 0

Эта инструкция отменяет действие всех обработчиков, ранее установленных в пре-

делах функции, и сбрасывает в исходное состояние атрибуты объекта Err.

(Подробности, касающиеся объекта Err и способов его использования, приведены

ниже, в одноименном разделе этой главы.)

Пассивные обработчики ошибок

Пассивным

 называют такой обработчик, который позволяет программе про-

сто перейти к строке кода, следующей за ошибочной, а не "прыгать" к

I метке, указывающей на специальный блок кода. Синтаксис задания пас-

 сивного обработчика приведен ниже:

On Error Resume Next

Приведенная команда трактуется исполняющей системой таким образом: в случае

возникновения ошибки в любой последующей команде необходимо сразу перейти к

очередной строке. Поскольку это все-таки обработчик

 — пусть и простой, -

он отменяет все действия, предлагаемые по умолчанию.

В такой форме обработчик ошибок, использующий инструкцию Resume, применя-

ется очень редко. Но если вас устраивает это простое решение, заключающееся в пе-

реходе к очередной строке кода (и условия задачи позволяют поступать именно так),

пожалуйста, пользуйтесь на здоровье.

Например, Resume Next применяют при копировании набора данных, в случае,

когда отдельные поля являются нулевыми. Вы можете игнорировать пустые поля по-

средством Resume Next.

Использование команды Resume

Команда Resume весьма полезна и сама по себе, особенно в том случае, когда по-

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

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

Resume имеет смысл только после того, как предприняты какие-либо действия по

устранению источников возникновения проблемы.

 Часть VI. Работа над ошибками


background image

Листинг 18.3 демонстрирует пример использования команды Resume. Этот код

достаточно прост.

Листинг 18.3. Пример использования команды Resume

1:
2 :

4:
5:

6:

7:
8:

9:
10
11
12
13
14
15

17
18

19
20
21
22
23
24
25
26

Sub Test ( )

Call

End Sub

Sub

 Err As Object)

Call

End Sub

 As String) As Boolean

: FileExists =

 > 0

 Function

 FileName As String)

: On Error GoTo EXCEPT
: Kill FileName
: Exit Sub

:
: Const
: If

 <>

 Then Call

: If

 &

 & FileName &

 &

:

 vbRetryCancel ) = vbRetry) Then

: FileName =

 имя

 "Имя файла",

: If

 Then Resume

: End If

 Sub

I Строки

 листинга 18.3 содержат текст вспомогательной

 предназначенной для тестирования основной рассматриваемой в

данный момент процедуры — DeleteFile. Процедура, расположенная в

строках

 в сущности, необязательна. Ее тело можно было располо-

жить непосредственно в строке 20, но считаем, что процедура RaiseEr-

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

ошибок в процедуре DeleteFile стал заметно проще. Строки

 со-

держат вариант функции проверки существования файла. Эта функция

рассматривалась на прошлом занятии, а здесь нашла свое очередное
применение — нам не понадобилось разрабатывать ее вновь. "Гвоздь

программы" - процедура DeleteFile — занимает строки

В строке 16 расположена основная команда процедуры, ради выполнения которой

стоило осуществлять весь этот процесс, — директива Kill "убиения" файла с задан-
ным именем. Конечно, можно было бы внести Kill FileName во все части кода, где
это необходимо, но в таком случае пришлось бы зафомождать текст строками обра-
ботки ошибок. Удобно и целесообразно выносить подобные действия в отдельные

функции и строить в них обработчики ошибок — теперь обработчик не затеряется в

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

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

18-й час. Обработка ошибок во время выполнения программы

319