|
Программирование >> Проектирование интерфейса пользователя
Как строить обработчики ошибок Будем считать (в данном случае мы можем себе это позволить) понятия обработчика ошибок и обработчика исключений равнозначными. Microsoft в контексте темы программирования на VBA избегает употребления словосочетания обработчик исключений, поэтому так поступим и мы. (Подозреваю, что не только я, но и специалисты Microsoft понимают, что средства борьбы с ошибками, реализованные в VBA, нельзя назвать полноценным механизмом обработки исключительных ситуаций.) Сейчас в документации и литературе по VBA принят термин обработчик ошибок, так что мы вынуждены подчиниться и будем употреблять эту фразу для ссылок на образцы кода, которые изучаем. Но все равно ошибки, которые возникают в программе, - это, по существу, исключения. Блок обработчика ошибок состоит из заголовка и тела. Строка заголовка должна располагаться непосредственно перед той областью текста функции или процедуры, в которой существует наибольшая опасность возникновения ошибок. Тело обработчика всегда располагается в конце функции или процедуры - в отличие от условных конструкций, где строки кода, имеющие отношение к обработке ошибки, ничем не отличаются от всех других и размещаются тут же, внутри выражения. Код обработчика ошибки выполняется (если не подразумевается иное) только в случае ее действительного возникновения. Конструкциязаголовка обработчика ошибок Заголовок обработчика ошибок задается посредством выражения On Error GoTo. Его синтаксис приведен ниже. ▼ ▲ On Error GoTo Метка В ходе дальнейшего повествования, употребляя слово функция , имеем в виду как подлинные функции, так и процедуры (подпрограммы) или методы классов, при условии, если различия между ними в контексте обсуждения не существенны. Чтобы задать заголовок обработчика ошибок, вам необходимо буквально воспроизвести словосочетание On Error GOTO и сопроводить его наименованием метки, указывающей на строку кода, с которой начинается тело обработчика. Тело всегда размещается в конце функции. Листинг 18.1 содержит пример со строками заголовка обработчика и его метки. Листинг 18.1. Пример пустого обработчика ошибок Su st ( ) On Error GoTo EXCEPT EXCEPT: End Sub Чаще всего я даю меткам имя EXCEPT (исключение) - это исключает тяжкие раздумья по поводу поиска названий, соответствующих конкретной ситуации. Имя метки должно быть уникальным в пределах функции. Если та же функция содержит и другие обработчики ошибок, можно предложить использовать названия типа ЕХСЕРТ1, ЕХСЕРТ2 и т.д. Впрочем, если вы будете стараться писать короткие функции, проблема именования меток вообще исчезнет. I Строка 2 листингов. 1 содержит заголовок обработчика ошибок, указывающий на метку EXCEPT. В строке 3 размещается собственно метка. Обратите внимание на использование в названии метки символа двоеточия (:); это обязательная часть конструкции метки, ее отличительный признак. (В заголовке обработчика двоеточие не употребляется!) После выполнения инструкции строки 2 любая ошибка, возникающая далее, заставит программу перепрыгнуть на строку тела обработчика, следующую за указанной меткой. Правила именования меток Рекомендуется вводить названия меток символами верхнего регистра. В таком случае их легче распознавать в теле функций. Впрочем, это только совет. Вы вольны называть метки так, как хотите, но помните о необходимости быть последовательным в своих действиях - характерный (хотя, разумеется, не единственный и не самый главный) признак профессионализма. Следуйте принятым правилам неукоснительно - и ваша работа станет продвигаться вперед значительно быстрее. Не забывайте об инструкции Exit Листинг 18.1 содержит один недостаток. Если после строки 2 вы вставите код, который планируете тестировать (вы обязаны это сделать - иначе процедура лишена смысла), то тело обработчика ошибки, как и остальные строки, будет выполняться всегда. Листинг 18.2 демонстрирует исправленную версию процедуры Test, снабженную дополнительной командой Exit Sub. Листинг 18.2. Пример использования инструкции Exit Sub 1: Sub Test ( ) 2: On Error GoTo EXCEPT 3 : Exit Sub 4: EXCEPT: 5 : End Sub I Теперь все в порядке. При создании обработчика ошибок имеет смысл ввести в текст все эти строки (содержащие заголовок, команду Exit и метку) сразу, чтобы ничего не упустить. Если вы забудете вставить строку с Exit, программа, дойдя до метки, начнет выполнять инструкции тела обработчика и вместо устранения ошибок может вызвать их появление. Конкретный вид команды Exit зависит от типа программного блока, в контексте которого она употребляется. Если блок представляет собой процедуру (подпрофамму), вы должны написать Exit Sub. Для функций используется конструкция Exit Function, а для методов Property - Exit Property. (Подробнее о методах Property см. главу 21-й час. Основы программирования классов .) Чтобы процедура листинга 18.2 смогла выполнять что-то полезное, необходимо вставить между строками 2 и 3 функциональный код, а после строки 4 - код тела обработчика ошибок. Общие правила создания обработчиков ошибок Обращайтесь к средствам построения обработчиков ошибок только в тех случаях, когда отчетливо представляете, какого рода ошибки могут возникнуть и как их устранить. Действия, предусмотренные VBA по умолчанию, предполагают отображение окна сообщения с текстом, описывающим характер ошибки, и выдачу звукового сигнала. Если вы не можете придумать ничего лучшего по сравнению с операциями, выполняемыми по умолчанию, не создавайте обработчик ошибок. Исключением может служить необходимость документирования сообщений об ошибках в журнальном файле. Иногда бывает полезным, наряду с собственными творческими достижениями, использовать и стандартные операции обработки ошибок. Но действия, предпринимаемые по умолчанию, выполняются только в случае отсутствия обработчика. Если обработчик создан, а вы хотели бы еще и имитировать стандартные операции, достаточно обратиться к объекту Err, который содержит информацию о возникшей ошибке (подробнее об этом см. раздел Использование объектов класса Err данной главы). Очистка состояния обработчика ошибок Область действия обработчика ошибок ограничена пределами функции. Если вы построили обработчик, он будет работать только внутри текущей функции. При необходимости очистки состояния обработчика ошибок на уровне функции следует выполнить команду On Error GoTo 0 Эта инструкция отменяет действие всех обработчиков, ранее установленных в пределах функции, и сбрасывает в исходное состояние атрибуты объекта Err. (Подробности, касающиеся объекта Err и способов его использования, приведены ниже, в одноименном разделе этой главы.) Пассивные обработчики ошибок - о S..... .£ . Пассивным называют такой обработчик, который позволяет программе просто перейти к строке кода, следующей за ошибочной, а не прыгать к I, метке, указывающей на специалъный блок кода. Синтаксис задания пассивного обработчика приведен ниже: On Error Resume Next Приведенная команда трактуется исполняющей системой таким образом: в случае возникновения ошибки в любой последующей команде необходимо сразу перейти к очередной строке. Посколъку это все-таки обработчик ошибок - пустъ и простой, -он отменяет все действия, предлагаемые по умолчанию. В такой форме обработчик ошибок, использующий инструкцию Resume, применяется очень редко. Но если вас устраивает это простое решение, заключающееся в переходе к очередной строке кода (и условия задачи позволяют поступать именно так), пожалуйста, пользуйтесь на здоровье. Например, Resume Next применяют при копировании набора данных, в случае, когда отдельные поля являются нулевыми. Вы можете игнорировать пустые поля посредством Resume Next. Использование команды Resume Команда Resume весьма полезна и сама по себе, особенно в том случае, когда после выполнения кода обработчика необходимо вернуться к строке, вызвавшей ошибку, и попытаться выполнить ее заново. Resume просто запускает на повторное выполнение команду, которая явилась причиной последней ошибки, поэтому использовать Resume имеет смысл только после того, как предприняты какие-либо действия по устранению источников возникновения проблемы.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |