Структура обработчика ошибок
Обработчик, способный обработать ошибку, должен распознать ее, понять к какому классу относится ошибка - классу устранимых ошибок или классу критических ошибок, последствия которых устранить невозможно. В первом случае, обработчик устраняет причину или следствия ошибки и возвращает управление в охраняемый блок для продолжения вычислений. Во втором случае, обработчик завершает исполнение, предварительно сообщив пользователю всю возможную информацию о причинах, приведших к такому результату.
Как правило, каждый обработчик предназначен для обнаружения и исправления ошибок некоторого класса. Поэтому, когда он встречается с ошибкой другого класса, то он не способен ее обработать. В этом случае он передает эту функцию выше стоящему обработчику. Реализуется это тем, что обработчик вызывает метод Raise с тем же номером ошибки. При возбуждении ошибки в обработчике ошибки возобновится процесс подъема по стеку вызовов и управление сможет получить следующий активный обработчик ошибки, который в свою очередь, либо обработает ошибку, либо передаст ее вверх. Заметим, что возбуждение ошибки в обработчике ошибки может быть сознательным, но может быть и из-за того, что некорректно работает сам обработчик. В любом случае возбуждение ошибки приведет к подъему по стеку вызовов.
Типичный обработчик ошибок представляет собой оператор выбора Select, в котором каждый случай соответствует одной обрабатываемой ошибке, а для непредусмотренных ошибок происходит повторное их возбуждение и, тем самым, передача их вверх по стеку вызовов. Допустим, в охраняемом блоке процедуры ожидаются ошибки с кодами K1, K2, …, Kn - обработчик ошибок этой процедуры может быть таким:
'ErrorHandler:
Select Case Err.Number ' анализ кода ошибки.
Case K1
… 'обработка ошибки с кодом K1
Case K2
… 'обработка ошибки с кодом K2
. . .
Case Kn
… 'обработка ошибки с кодом Kn
Case Else
'Передача управления обработчику,выше стоящему в стеке вызовов
Dim intErrNum As Integer
intErrNum = Err.Number 'номер ошибки
Err.Clear ' чистка объекта Err.
Err.Raise Number:= intErrNum ' повторное возбуждение ошибки
End Select
Метод Raise здесь используется для повторения исходной ошибки. Если произойдет ошибка, отличная от ошибок с кодами K1, K2, …, Kn, управление будет передано вверх по стеку вызовов другому активному обработчику, если таковой есть. Заметьте, перед вызовом метода Raise происходит чистка объекта Err.
Сделаем еще несколько замечаний об обработке ошибок в Office 2000:
-
Коды всех внутренних, перехватываемых ошибок можно найти в разделе справочной системы "Trappable Errors" (Перехватываемые ошибки).
-
Если ошибка выполнения возникла в некоем объекте вне VBA (например, в рабочей странице Excel) и не обработана этим объектом, а возвращена в VBA-программу, она будет автоматически преобразована VBA в ошибку с кодом 440, которая определена как "Automation Error" (Ошибка программирования объектов). Такую ошибку желательно сразу же обработать. Если же Вы хотите передать ее на обработку вверх в вызывающую процедуру, желательно возбудить ошибку со своим специальным номером, чтобы вызывающая процедура могла различать ошибки, возникающие в разных объектах.
-
Объекты Office 2000, кроме рассмотренных выше средств работы с ошибками, могут иметь дополнительные средства для их распознавания и обработки. Например, для диалоговых окон и элементов управления определено событие Error, позволяющее обрабатывать их специфические ошибки, которые не могут быть переданы в VBA. Информация об ошибках операций доступа к базам данных может быть получена с помощью объекта Error и семейства Errors из библиотеки объектов доступа к данным (DAO). Описание ошибки Microsoft Access или объекта доступа к данным можно получить по номеру ошибки методом AccessError.
- Объект Debug и его методы
- Метод Print
- Метод Assert
- Доказательство правильности программ
- Условная компиляция и отладка
- Директива #const
- #If … Then … #Else директива
- Ошибки периода выполнения и их обработка
- Модель управления ошибками в языке vba.
- Оператор On Error
- Оператор Resume
- Объект Err
- Метод Clear
- Метод Raise
- Класс и обработка ошибок
- Обработчики ошибок и вложенные вызовы процедур
- Структура обработчика ошибок
- Функция CvErr
- Оптимизация программ
- Приемы оптимизации кода
- Объявление переменных
- Математические операции
- Строковые операции
- Проектирование интерфейса. Меню
- Общие объекты Office 2000
- Коллекция CommandBars
- Свойства и методы коллекции CommandBars
- Свойства и методы объекта CommandBar
- Коллекция CommandBarControls и ее элементы
- О роли интерфейса
- Создание собственных и модификация встроенных меню
- Немного терминологии
- Возможности настройки и изменения системы меню
- Создание собственного головного меню
- Использование диалогового окна Настройка
- Создание меню с помощью vba
- Добавление выпадающих меню
- Использование диалогового окна Настройка
- Как добавить встроенное меню
- Добавление выпадающего меню с помощью vba
- Добавление подменю
- Вставка и группировка команд
- Добавление встроенной команды с помощью окна Настройка
- Добавление собственной команды с помощью окна Настройка
- Добавление команд с помощью vba
- Пример построения документа с собственным меню
- Группировка команд меню
- Удаление команд меню
- Удаление команды с помощью окна Настройка
- Удаление команды с помощью vba
- Как восстановить удаленные встроенные компоненты меню
- Изменение меню во время работы программы
- Вывод собственной панели меню
- Динамическое изменение видимости команд меню
- Управление доступом к командам меню
- Переименование команды меню
- Диалоговые окна и элементы управления
- Общие сведения и применение
- Встроенные диалоговые окна Коллекция Dialogs и объект Dialog
- Вывод сообщений. Функция MsgBox
- Окно ввода данных. Функция InputBox
- Создание пользовательских диалоговых окон
- Создание страниц и вкладок в диалоговых окнах
- Добавление дополнительных элементов управления
- Пример создания диалогового окна
- Разработка процедур, обрабатывающих события диалогового окна и его устройств
- Вызов собственного диалогового окна
- Установка начальных значений свойств элементов управления
- Использование Me в качестве имени текущего диалогового окна
- Модификация управляющих элементов во время работы
- Управление доступом к элементу
- Перемещение фокуса на элемент управления
- Изменение размеров диалогового окна
- Проверка корректности данных
- Обмен данными с диалоговым окном
- Закрытие диалогового окна
- Объект UserForm (диалоговое окно), коллекция UserForms (диалоговые окна)
- Коллекция Controls
- Объекты - элементы управления Перечень основных элементов управления
- Общие свойства элементов управления Объект-родитель
- Имя объекта
- Значение объекта
- Расположение объекта
- Параметры внешнего вида объекта
- Свойства поведения объекта
- Другие свойства
- CheckBox - флажок (кнопка выбора)
- ComboBox - комбинированный список
- CommandButton - командная кнопка
- Frame - рамка (группы)
- Image - изображение
- Label - метка (надпись, статический текст)
- ListBox - список
- MultiPage - набор страниц
- OptionButton - кнопка-переключатель
- ScrollBar - полоса прокрутки
- SpinButton - счетчик
- TabStrip - полоса вкладок
- TextBox - поле ввода (окно редактирования)
- ToggleButton - выключатель
- Объект DataObject
- Перемещение объектов. Как реализовать технику DragAndDrop
- События Событие AddControl (добавился элемент)
- Событие AfterUpdate (После модификации)
- Событие BeforeDragOver (Перед завершением перетаскивания)
- Событие BeforeDropOrPaste (Перед опусканием или вставкой)
- Событие BeforeUpdate (Перед модификацией)
- Событие Change (Изменение)
- Событие Click (Щелчок)
- Событие DblClick (Двойной щелчок)
- Событие DropButtonClick (Щелчок кнопки списка)
- События Enter, Exit (Вход, Выход)
- Событие Error (Ошибка)
- События KeyDown, KeyUp (Клавиша нажата, Клавиша отпущена)
- Событие KeyPress (Клавиша нажата)
- Событие Layout (Расположение)
- События MouseDown, MouseUp (Мышь нажата, Мышь отпущена)
- Событие MouseMove (Мышь движется)
- Событие RemoveControl (Удаление элемента)
- Событие Scroll (Прокрутка)
- События SpinDown (Уменьшить счетчик), SpinUp (Увеличить счетчик)
- Событие Zoom (Расширение)
- Методы Метод Add (Добавить)
- Метод AddItem (Добавить элемент)
- Метод Clear (Очистить)
- Метод Copy (Копировать)
- Метод Cut (Вырезать)
- Метод DropDown (Вывести список)
- Метод Move (Сдвинуть)
- Метод Paste (Вставить)
- Реализация операций Cut, Copy, Paste в диалоговых окнах
- Метод RedoAction (Повторить действие)
- Метод Remove (Удалить)
- Метод RemoveItem (Удалить элемент)
- Метод Repaint (Перерисовать)
- Метод Scroll (Прокрутить)
- Метод SetDefaultTabOrder (Установить стандартный порядок обхода)
- Метод SetFocus (Установить фокус)
- Метод UndoAction (Отменить действие)
- Реализация операций Undo и Redo в диалоговых окнах
- Метод zOrder (z-упорядочить)
- Основные виды файлов в Office 2000
- Открытие и создание файлов
- Закрытие файлов
- Запись в файлы последовательного доступа
- Чтение файлов последовательного доступа
- Ввод-вывод для файлов произвольного доступа и бинарных файлов
- Работа с данными переменной длины
- Один пример работы с Binary файлом