Библиотека: А. Горев, С. Макашарипов, Р. Ахаян. Эффективная работа с СУБД

Глава 12
Подготовка и отладка пользовательского приложения
12.1. Общие принципы отладки приложения
12.2. Инструментальные средства отладки
Отладка программы в Visual FoxPro
Отладка программы в Access
Обработка ошибок процессора баз данных в Access
Отладка программы в Visual Basic
12.3. Подготовка приложения для распространения

12.1. Общие принципы отладки приложения

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

  • Синтаксические ошибки связаны, как правило, с неправильным написанием команд и функций.
  • Ошибки выполнения программы происходят чаще всего из-за отсутствия вызываемых компонентов, например открываемых таблиц, вызываемых функций, объектов и т. д.
  • Логические ошибки приводят к неправильным результатам, несмотря на безукоризненную работу программы. Их причиной чаще всего является использование не соответствующих алгоритму данных или выполнение вычислений в неправильной последовательности. Это самые трудные для выявления ошибки.

    Для выявления ошибок в пользовательской программе разработчик может использовать в Visual FoxPro следующие средства:

  • Окно Trace для отслеживания процесса выполнения программы.
  • Окно Debug для наблюдения за значениями переменных, полей, возвращаемых значений функций и задания условий приостановки выполнения программы.
  • Окно Command, позволяющее в большинстве случаев во время ожидания программой действий пользователя выполнить интересующие действия или быстро вывести текущие значения.
  • Можно добавить в программу специальный отладочный код, который будет выводить контрольные сообщения и другую важную для отладки информацию. В этом случае чаще всего используются команды WAIT WINDOW, ? или функция MESSAGEBOX(). Можно также периодически сохранять значения переменных с помощью команды LIST MEMORY TO FILE.

    Access и Visual Basic имеют менее богатый набор средств отладки. В то же время проверка синтаксиса набираемого программного кода выполнена в них более удобно. При написании программы в Visual Basic, а следовательно, и в Access синтаксические ошибки перехватываются уже при переходе на следующую строку при редактировании кода процедуры или функции или сразу перед исполнением кода. Например, если при создании конструкции выбора с помощью оператора If вы, написав выражение условия, не завершаете ее оператором Then, то немедленно получите сообщение об ошибке, и строка с неправильной командой будет выделена:

Sub Form_After_Update()
     If me![txtTeam]>> "Boston"
...
     End If
End Sub

    Простые ошибки, связанные с неправильным написанием команд, в Visual FoxPro выявляются при компиляции программы. Сообщения о таких ошибках выводятся на экран и сохраняются на диске в файле с именем, одинаковым с именем программы и имеющим расширение ERR, если сделана установка

SET LOGERRORS ON | off
    которая сохраняет все сообщения об ошибках в текстовом файле.
SET DEVELOPMENT ON | off

    проверяет дату и время создания программного файла и, если файл с исходным кодом создан позднее, чем с объектным (после компиляции), автоматически перекомпилирует его перед выполнением.
    Эти установки можно сделать и в диалоговом режиме, выбрав вкладку General в окне Options, вызвать которое можно в меню Tools.

12.2. Инструментальные средства отладки

    В этом параграфе мы рассмотрим основные методы и способы отладки пользовательского приложения в Visual FoxPro, Access и Visual Basic.

Отладка программы в Visual FoxPro

    Для выявления ошибок, связанных с неправильными вычислениями или ветвлением программы, в FoxPro имеется целый комплекс специальных средств, делающих работу по отладке программы быстрой и эффективной. При проверке сомнительных мест в программе поможет команда Trace Window из меню Tools или установка

SET ECHO on | OFF

    которая активизирует окно трассировки Trace для отслеживания работы программы по ее исходному тексту, так как текущая выполняемая команда в этом окне выделяется. На рис. 12.1 приведено окно Trace и даны пояснения для его основных элементов. С помощью команд, расположенных в меню окна, можно выполнить следующие действия:


Рис. 12.1.
  • Open - открытие программы.
  • Cancel - прерывание работы программы.
  • Line Numbers - нумерация программных строк.
  • Clear Breakpoints - удаление точек останова.
  • Trace Between Breaks - управление режимом просмотра команд в окне Trace.
  • Throttle - установка задержки времени выполнения команд в программе.

    Для наблюдения за выполнением программы с помощью окна Trace необходимы следующие действия:

  1. Выполните команду Trace Window из меню Tools.
  2. Откройте требуемую программу с помощью команды Open меню Program окна Trace.
  3. Установите задержку выполнения кода для возможности визуального наблюдения с помощью команды Throttle этого же меню. Время задержки придется подобрать опытным путем, так как этот показатель зависит от сложности программы и быстродействия компьютера.
  4. Запустите программу на выполнение, выбрав меню Do окна Trace.

    Если вам необходимо тщательное наблюдение за результатом выполнения каждой строки кода, вы можете выбрать на четвертом этапе пошаговое выполнение программы, щелкнув на меню Step! окна Trace. В этом случае следующая строка программы будет выполняться только после очередного щелчка на этом меню.
    В этом режиме выбор меню Out! позволяет отменить пошаговый режим и продолжить выполнение программы до первой строки программы более высокого уровня, следующей за командой, вызвавшей текущую программу. Если программы более высокого уровня нет, завершится выполнение текущей программы.
    Пpеpвать выполнение пpогpаммы можно нажатием клавиши Esc. Если необходимо пpиостановить выполнение пpогpаммы в опpеделенных точках, щелкните мышкой на поле слева от нужной строки. Слева от стpоки появится отметка в виде точки. Каждый pаз пpи достижении этого места выполнение пpогpаммы будет пpиостанавливаться, что позволит пpосмотpеть содержимое таблиц, значений всех вpеменных пеpеменных и выполнить дpугие действия, связанные с контpолем состояния сpеды, а затем пpодолжить (Resume) или пpеpвать работу программы (Cancel). Отменить пpиостановку можно повтоpением указанных действий.
    Расширить возможности трассировки позволяет установка

SET DEBUG ON | off

    которая дает возможность контpолиpовать значения любых выpажений и задавать условия приостановки выполнения программы во вpемя ее pаботы (команда Debug Windows в меню Tools). Hабеpите идентификатоpы вpеменных пеpеменных, элементов массива, стандаpтных функций или полей таблиц в левой части окна отладки, после набоpа каждого идентификатоpа нажимайте клавишу Enter. Пpи выполнении пpогpаммы значения этих выpажений будут выводиться в пpавой части окна.
    В окне отладки можно устанавливать контpольные точки для пpиостановки pаботы пpогpаммы пpи смене значений, указанных в левой части выpажений. Hажмите клавишу пробела или кнопку мыши напpотив нужного выpажения в колонке, котоpая pазделяет левую и пpавую части окна: появится отметка в виде точки, снять отметку можно, повтоpив указанные действия.
    Если вы хотите просматривать написанный вами код событий и методов при работе формы, то нам потребуется использовать окна Trace и Debug совместно, как это показано на рис. 12.2. Для этого выполните следующие действия:


Рис. 12.2.
  1. Откройте окно Debug.
  2. Наберите в его левой части строку типа PROGRAM()="MOUSEMOVE", в которой необходимо указать имя события или метода, код которого вас интересует. Установите на разделительной линейке точку останова.
  3. Откройте окно Trace.
  4. С помощью меню Do окна Trace запустите нужную форму.
  5. При выполнении события MouseMove окно Trace будет активизироваться и вы сможете просматривать код или задавать его пошаговое выполнение.

    Эффективность отладки в Visual FoxPro, особенно в период опытной эксплуатации программы, могут повысить следующие команды.

SET ALTERNATE TO [FileName [ADDITIVE]]

    Создает на диске текстовый файл с именем FileName (по умолчанию pасшиpение TXT), в котоpом дублиpуются pезультаты выполнения всех команд, кpоме полноэкpанных, что позволяет контpолиpовать пpоцесс pаботы пpогpаммы даже без пpисутствия pазpаботчика (в пеpиод опытной эксплуатации) и опpеделять пpичины сбоя или непpавильных действий опеpатоpа. Конечно, эта пpоцедуpа тpебует достаточного дискового пpостpанства и несколько замедляет pаботу пpогpаммы. Без паpаметpов команда закpывает текущий альтеpнативный файл. С опцией ADDITIVE добавляет данные в файл, в пpотивном случае его содеpжимое пеpезаписывается.

SET ALTERNATE on | OFF

    Включает (ON) или выключает (OFF) pежим записи данных в альтеpнативный файл.

ON ERROR [Command]

    Устанавливает режим ожидания для ошибочных ситуаций во время работы программы. В случае возникновения ошибки выполняется указанная команда. Как правило, это команда запуска специальной процедуры обработки ошибок.
    Без аргумента команда восстанавливает режим обработки ошибочных ситуаций Visual FoxPro. При возникновении ошибки Visual FoxPro приостанавливает работу программы и при наличии исходного кода выводит на экран окно Trace, в котором строка кода, вызвавшего ошибку, выделена. Очевидно, что даже в отлично отлаженной программе могут возникать ошибочные ситуации хотя бы по внешним причинам, связанным со случайным удалением файлов и т. д. Поэтому любая пользовательская программа должна иметь специальный блок обработки ошибок, основу которого и будет составлять команда ON ERROR. Пример такой программы мы приведем в конце этого параграфа, а логика, которая должна быть заложена в блок обработки ошибок, демонстрируется на рис. 12.3.


Рис. 12.3.

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

PROCEDURE Object.Error
LPARAMETERS [nIndex,] nError, cMethod, nLine

    Параметр nIndex позволяет сослаться на элемент управления по его номеру в массиве элементов управления объекта-контейнера (формы). Параметр nError содержит номер ошибки Visual FoxPro, cMethod - имя метода, который вызвал ошибку, nLine - номер строки внутри метода или определяемой пользователем функции, которая вызвала ошибку.
    В то же время, если при обработке ошибки в процедуре обработки события Error возникнет еще одна ошибка, Visual FoxPro вызовет обработчик, указанный в установке ON ERROR, или, если такой обработчик не указан, приостановит выполнение программы.
    Например, мы можем в событие Error формы записать код, который будет выполняться, если невозможно открыть связанные с формой таблицы, так как администратор БД проводит переиндексацию файлов:

LPARAMETERS nError, cMethod, nLine
* Ошибка "File in use by another"
IF nError = 108
     =MESSAGEBOX("Данные не доступны! " + ;
     "Попробуйте открыть форму позднее.")
ELSE
* В случае другой ошибки вызываем общую процедуру
* обработки ошибок, установленную в главной программе
DO proc_error
ENDIF

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

ERROR nErrorNumber | nErrorNumber, cMessageText1
     [cMessageText2]

    которая генерирует ошибку Visual FoxPro. Параметр nErrorNumber определяет номер ошибки, который используется для воспроизведения стандартного сообщения Visual FoxPro. Параметр cMessageText1 задает текст, появляющийся в сообщении об ошибке, который может содержать дополнительную информацию. Например, если вы ссылаетесь на переменную, которой не существует, Visual FoxPro может вывести имя этой переменной в сообщении об ошибке. Параметр cMessageText2 определяет текст, отображаемый в сообщении об ошибке. Когда вместо параметра nErrorNumber в команде задается параметр cMessageText2, будет сгенерирована ошибка Visual FoxPro с номером 1098 (определяемая пользователем ошибка). Чтобы переместить часть сообщения об ошибке на следующую строку, используйте в cMessageText2 символ возврата каретки CHR(13).
    Команда ERROR может использоваться помимо проверки программы обработки ошибок для того, чтобы показать особые сообщения об ошибках. Если действует установка ON ERROR, то при выполнении команды ERROR Visual FoxPro выполняет процедуру обработки ошибок, определяемую в установке ON ERROR. Если происходит ошибка для объекта, будет выполнено событие Error для этого объекта.
    Если вы задаете команду ERROR из окна Command и установка ON ERROR не действует, Visual FoxPro показывает сообщение об ошибке. Если команда ERROR выдана в программе и установка ON ERROR также не действует, Visual FoxPro выводит сообщение об ошибке и разрешает вам закончить или приостановить программу, либо игнорировать ошибку.
    Например, чтобы задать появление ошибки Visual FoxPro номер 12, напишем следующую команду в требуемом месте программы:

ERROR 12

    Появится сообщение об ошибке "Variable not found" ("Переменная не найдена"). Если задать эту команду в следующем виде:

ERROR 12, `nVar1'

    появится сообщение об ошибке "Variable `nVar1' not found" ("Переменная `nVar1' не найдена").
    Для получения более обширной информации при отладке пpогpаммы можно использовать следующие функции.

AERROR(ArrayName)

    Создает массив, содержащий информацию относительно самой последней ошибки Visual FoxPro, OLE или ODBC. Параметр ArrayName определяет имя создаваемого массива. Функция AERROR() создает массив с шестью столбцами и возвращает число строк в массиве, которое определяется типом ошибки. Следующий список описывает содержание каждого элемента массива:

Номер элемента Описание
1Числовой. Содержит номер ошибки. Идентичен значению, возвращаемому функцией ERROR().
2Символьный. Текст сообщения об ошибке. Идентичен значению, возвращаемому функцией MESSAGE().
3Значение NULL. Если ошибка имеет дополнительный параметр, содержит текст параметра ошибки. Идентичен значению, возвращаемому функцией SYS(2018).
4Значение NULL. Однако, как и в предыдущем случае, может содержать номер рабочей области, в которой произошла ошибка.
5Значение NULL. Если триггер не смог выполниться (ошибка 1539), будет содержать одно из следующих числовых значений:
1 - триггер вставки потерпел неудачу;
2 - триггер модернизации потерпел неудачу;
3 - триггер удаления потерпел неудачу.
6Значение NULL
7Значение NULL.
    В следующем списке описано содержимое каждого элемента создаваемого массива, когда происходят ошибки OLE с номерами 1427 или 1429:
Номер элементаОписание
1Числовой. Содержит код ошибки 1427 или 1429.
2Символьный. Текст FoxPro сообщения об ошибке.
3Символьный. Текст OLE сообщения об ошибке.
4Символьный. Имя прикладной программы (например, Microsoft Excel).
5Значение NULL или Символьный. В последнем случае содержит имя справочного файла, где может быть найдена более подробная информация относительно ошибки.
6Значение NULL или Символьный. В последнем случае содержит идентификатор для соответствующей темы оперативной подсказки, если информация доступна из приложения.
7Числовой. Номер ошибки OLE.

    Ниже приводится описание содержимого каждого элемента массива, когда происходит ошибка ODBC с номером 1526 (ошибка соединения ODBC). Массив может содержать две или больше строки - по одной для каждой ошибки ODBC:

Номер элементаОписание
1Числовой. Содержит номер ошибки 1526.
2Символьный. Текст сообщения об ошибке.
3Символьный. Текст ODBC сообщения об ошибке.
4Символьный. Текущее состояние ODBC SQL.
5Числовой. Номер ошибки ODBC источника данных.
6Числовой. Указатель соединения ODBC.
7Значение NULL.
ERROR()
    Возвpащает номеp ошибки, котоpая пpоизошла пpи выполнении пpогpаммы, если действует команда ON ERROR.
LINENO([1])

    Возвpащает номеp стpоки пpогpаммы относительно первой строки главной программы, в котоpой пpоизошла ошибка. Если вы указываете параметр 1, то номер строки вычисляется относительно первой строки текущей программы или процедуры.
    Счетчик строк в программе учитывает все строки, включая комментарии и пустые строки. Вы всегда можете задать приостановку выполнения программы, если откроете окно Debug на время выполнения программы и в его левой части запишете, например, LINENO(1) = 100. После этого не забудьте на разделительной линии окна Debug поставить точку останова.

MESSAGE([1])

    Возвpащает сообщение об ошибке, с помощью опции 1 можно вывести последнюю пpогpаммную стpоку, пpи выполнении котоpой пpоизошла ошибка. Для pаботы функции необходимо установить ON ERROR.

PROGRAM([nLevel])

    Возвpащает название пpогpаммы, во вpемя pаботы котоpой пpоизошла ошибка. Численный аpгумент опpеделяет уpовень вложенности пpогpамм, чьи имена необходимо запомнить, если nLevel = 1, то возвpащается имя только пеpвой исполнявшейся пpогpаммы (главной), если аpгумент не указан, возвpащается имя текущей пpогpаммы.
    Работу описанных выше функций можно пpоиллюстpиpовать следующим пpостым пpимеpом:

ON ERROR DO proc_error WITH;
ERROR(),MESSAGE(),MESSAGE(1),PROGRAM(),LINENO()
. . .
RETURN
PROCEDURE proc_error
LPARAMETER nError, cMess, cMess1, cProg, nLineno
? "Hомер ошибки: " + LTRIM(STR(nError))
? "Сообщение об ошибке: " + cMess
? "Текст строки, вызвавшей ошибку: " + cMess1
? "Hомер строки с ошибкой: " + LTRIM(STR(nLineno))
? "Ошибка пpоизошла в пpогpамме: " + cProg
RETURN

Отладка программы в Access

    Четыре из наиболее часто используемых функций отладки доступны через панель инструментов Access. Их описание приведено в табл. 12.1. На рис. 12.4 представлена панель инструментов для выполнения отладки и приведено описание ее кнопок.


Рис. 12.4. Наиболее часто используемые функции отладки в Access
Таблица 12.1. Инструментальные функции отладки в Access
Кнопка отладкиВыполняемое действиеСоответствующая горячая клавиша
Установка точки остановаСоздает или уничтожает точку останова. Точка останова F9
Шаг с заходом в процедуруВ окне просмотра кода при вызове другой процедуры вы видите ее кодF8
Шаг без захода в процедуруВ окне просмотра кода при вызове другой процедуры вы не видите ее кодаShift+8
СбросПрекращает работу процедуры-

    Состояние прерывания приостанавливает работу программы и дает вам картину состояния на текущий момент исполнения программы.
    СУБД Access попадает в состояние прерывания, когда происходит одно из следующих событий:

  • Программа достигает строчки с точкой останова.
  • Исполняемый код достигает строчки с выражением Stop.
  • Выражение в строке кода генерирует неперехватываемую ошибку.

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

  • просматривать значения переменных, свойств и выражений;
  • изменять значения переменных и свойств.

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


Рис. 12.5.

    Внутри вашего кода вы можете использовать метод Print объекта Debug, для того чтобы послать вывод в окно отладки. Этот способ позволяет вам создать историю значений переменной или свойства в процессе выполнения в окне отладки. Когда приложение приостановится или закончит свою работу, вы сможете увидеть напечатанные значения. Например, следующее значение выведет в окно отладки значение переменной myvar:

Debug.Print "Значение переменной равно =" & myvar

    Эта техника хорошо помогает, когда имеется место в программе, где переменная (в нашем случае myvar) изменяется. Например, вы можете использовать выражение, которое меняет значение переменной vyvar, в цикле.
    Вы можете работать с диалоговым окном Вызовы (Calls), приведенном на рис. 12.6, для исследования последовательности действий приложения в случаях, если оно состоит из цепочки вложенных вызовов процедур.


Рис. 12.6. Диалоговое окно Вызовы

    Для того чтобы вызвать диалоговое окно Вызовы, необходимо:

  • Приостановить выполнения кода. Вы можете вывести диалоговое окно Вызовы, только когда выполнение кода приостановлено.
  • Щелкнуть на кнопке Вызовы в панели инструментов.

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

  • Остановить выполнение программы.
  • Продолжить выполнение, если вы разрешите проблемы в окне отладки.
  • Просмотреть окно отладки, где в это время вы можете увидеть выделенной строчку, которая привела к ошибке.
  • Перейти прямо к строчке, которая вызвала ошибку.
  • Вызвать Справку по данной ошибке.

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

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

    Большая часть обработчиков ошибок имеет общую схему. Когда Access сталкивается с ошибкой времени выполнения, он ищет выражение On Error Goto <<выражение>>. Если он его находит, ошибка обрабатывается и выполнение продолжается либо с того же выражения, на котором оно остановилось, либо с какого-нибудь другого.
    Если Access не может найти выражение On Error Goto, выполнение процедуры приостанавливается и Access выводит сообщение об ошибке времени выполнения, которое может в какой-то степени удивить ваших пользователей.
    Существует восемь стандартных функций и выражений для перехвата ошибок. Их описание приведено в табл. 12.2.

Таблица 12.2. Основные программные функции отладки в Access
Выражение или функцияОписание
On Error GotoПодключает обработчик ошибок и указывает расположение обработчика внутри процедуры. Может также использоваться для отключения обработчика ошибок
Err (Выражение) Устанавливает свойство Err в указанное значение
Err (Функция) Возвращает статус ошибки
Error (Выражение) Воспроизводит ошибку
Error (Функция) Возвращает сообщение об ошибке, соответствующее указанному номеру
ResumeПродолжает выполнение с выражения, которое вызвало ошибку, после того как обработчик ошибок отработал
Resume NextПродолжает выполнение со строки, следующей за строкой, которая вызвала ошибку, после того как обработчик ошибок отработал
Resume СтрокаПродолжает выполнение с указанной строки и метки после обработки ошибки

    Существуют три действия, которые можно применить к большинству обработчиков ошибок:

  • Установка перехватчика ошибок. Каждая процедура или функция, которая поддерживает перехват ошибок, должна включать выражение On Error, которое указывает Access, где искать инструкции по обработке ошибок. Хотя команда On Error должна указывать на метку или строку внутри той же самой процедуры, выражение после метки может вызывать другую процедуру.
  • Оформление обработчика ошибок. Обработчик ошибок обычно состоит из выражения Select Case (или похожего выражения для принятия решений), которое различает разные значения свойства Err и способ их обработки.
  • Выход из обработчика. Используйте одно из выражений Resume для указания выхода из процедуры, если ошибка приводит к тупиковой ситуации, или для продолжения выполнения программы.

    Для отключения обработчика ошибок вставьте следующее выражение в код вашей процедуры:

On Error Goto 0

    Когда Access наталкивается на ошибку времени выполнения, он ищет неактивный обработчик ошибок в следующей последовательности:

  1. Текущая процедура.
  2. Процедуры, перечисленные в списке Вызовы (начиная с самой последней вызываемой процедуры).
  3. Обработчик ошибок внутри Access, который останавливает выполнение программы и выводит диалоговое окно ошибки времени выполнения.

Обработка ошибок процессора баз данных в Access

    Ошибки, связанные с работой процессора баз данных, вызывают событие Error. Это относится к ошибкам процессора баз данных Microsoft Jet, но не к ошибкам времени выполнения Access. Выполняя процедуру события или макроса при возникновения события Error, вы можете предотвратить вывод сообщения об ошибке Microsoft Access и вывести пользовательское сообщение об ошибке, которое может оказаться более подходящим по контексту для вашего приложения.
    Свойство OnError используется для того, чтобы указать макрос или процедуру Access, которая будет выполняться при возникновении события Error. Устанавливайте это свойство тем же путем, которым вы устанавливаете остальные свойства.
    Например, синтаксис для процедуры события Error формы должен иметь следующую конструкцию:

Sub Form_Error(DataErr As Integer, Response As Integer)

    Аргумент DataErr является кодом ошибки, возвращаемым функцией Err при возникновении ошибки. Вы можете использовать аргумент DataErr вместе с функцией Error$, чтобы соотнести номер ошибки с соответствующим сообщением об ошибке. Аргумент Response определяет, будет ли выводиться сообщение об ошибке. Для задания значения этого аргумента можно использовать одну из следующих констант:

  • DATA_ERRCONTINUE - это значение приводит к игнорированию ошибки, и код продолжается без вывода сообщения об ошибке. Вы можете добавить свое собственное сообщение об ошибке.
  • DATA_ERRDISPLAY - это значение по умолчанию. Будет выведено стандартное сообщение об ошибке Microsoft Access.

Отладка программы в Visual Basic

    Основным визуальным средством отладки в Visual Basic является окно Debug. Это окно позволяет выполнять достаточно много функций, и его основные элементы представлены на рис. 12.7.


Рис. 12.7. Окно отладки Debug в Visual Basic

    Это окно имеет две панели. В верхней части расположена панель Watch, которая позволяет выводить значения интересующих нас переменных, значений свойств или выражений во время выполнения программы. Переменная или выражение могут быть занесены на эту панель с помощью команды Add Watch меню Tools. После выполнения этой команды на экране появляется одноименное диалоговое окно, представленное на рис. 12.8.


Рис. 12.8.

    Заранее выделенное выражение автоматически помещается в поле Expression этого окна. В блоке Context определяется дипазон, в котором будет отслеживаться изменение наблюдаемой величины. Не увлекайтесь, попытка отследить значения во всем диапазоне работы программы (пункты All Procedures и All Modules) может резко замедлить выполнение программы. В блоке Watch Type вы можете задать способ реакции Visual Basic на изменение значения наблюдаемого выражения.
    В нижней части окна отладки расположена панель Immediate, которая позволяет отображать информацию, связанную с отлаживаемыми операторами, а также непосредственно вводить необходимые команды, как это можно делать в окне Command Visual FoxPro.
    Сама процедура выполнения отладки программы Visual Basic аналогична описанной ранее для программы Access.

12.3. Подготовка приложения для распространения

    Если вы считаете, что разработанное вами приложение вполне подходит для работы пользователя, пора подумать о том, как наиболее удобно переместить его на другой компьютер, который к тому же вряд ли имеет соответствующую среду разработки.
    В этом параграфе мы рассмотрим средства подготовки пользовательского приложения для распространения.
    Современное приложение для обработки данных может представлять собой достаточно большое число различных модулей, включающих данные и программы для их обработки. В этом плане чрезвычайно большое количество файлов имеет приложение, разработанное на Visual FoxPro. С него и начнем.
    В процессе создания пользовательского приложения по мере насыщения Project Manager различными модулями, Visual FoxPro автоматически создавал таблицу с расширением PJX, куда помещал необходимую информацию о составных элементах будущей прикладной программы. Используя эту таблицу, Project Manager может создать пользовательскую программу Visual FoxPro, которая будет включать в себя все элементы вашего проекта двух типов: в виде файла с расширением APP и в виде файла с расширением EXE (рис. 12.9). Для этого в Project Manager вам следует просто нажать кнопку Build. Но чуть-чуть терпения, перед тем как вы нажмете эту кнопку, нам следует рассказать еще о некоторых моментах, на которые следует обратить внимание перед построением пользовательской программы.


Рис. 12.9.

    В Project Manager все внесенные в него файлы делятся на две группы: включенные в пользовательскую программу или не включаемые в нее. Например, по умолчанию не включаются в программу файлы БД и все связанные с ней файлы. Посмотрите на список файлов в Project Manager. Перед именем таких файлов вы обнаружите перечеркнутый кружок. Включаемый в пользовательскую программу файл компилируется в объектный код и недоступен для изменения. Файлы, не включаемые в пользовательскую программу, должны распространяться отдельно. Для того чтобы включить или исключить какой-то файл из пользовательской программы, в меню Project выберите команду Project Info. Появляющееся после этого диалоговое окно Project Information приведено на рис. 12.10. Для изменения статуса файла откройте вкладку Files. Таким образом, перед построением пользовательской программы вы должны проверить наличие всех файлов, которые должны войти в файл приложения. Например, файлы изображений автоматически не включаются в проект, и вы должны вручную добавить их, так как распространение их в виде отдельных файлов запрещено лицензионным соглашением.


Рис. 12.10.

    На вкладке Project того же окна, которая показана на рис. 12.11, мы можем указать авторские реквизиты, задать параметры компиляции и выбрать значок, который будет включен в EXE-файл и может использоваться для создания ссылки при его запуске. Для подготовки пользовательской программы в параметрах компиляции следует отменить опцию Debug Info, так как при включенной опции в объектный код помещается специальный отладочный модуль, позволяющий при ошибке с помощью окна Trace указать место ее возникновения при наличии исходного файла и самой СУБД. Так как в пользовательской программе исходных текстов программ нет, то этот модуль бесполезен и только занимает лишнее место.


Рис. 12.11.

    Вы можете также включить опцию Encrypted, которая исключает возможность просмотра символьных фрагментов в объектном коде. Правда, практика использования предыдущих версий FoxPro показывает, что это не слишком надежная защита от умелых хакеров. С другой стороны, программы преобразования файлов пользовательской программы в исходный текст несколько раз помогали авторам спасти собственные разработки, для которых непостижимым образом исчезали исходные файлы, а в пользовательской программе вдруг обнаруживалась ошибка.
    Для того чтобы при компиляции установить точку запуска приложения, в Project Manager необходимо указать главную программу, как это видно на рис. 12.9. Для этого достаточно поставить курсор на этот файл и вызвать команду Set Main в меню Project. Как правило, в качестве главной программы используется или специальная программа, или файл главного меню приложения.
    Для построения приложения в Visual FoxPro можно использовать и специальную программу BUILDAPP.PRG, которая при установке профессиональной версии Visual FoxPro записывается в папку TOOLS\BUILDAPP папки Visual FoxPro. Эта программа создает файл пользовательского приложения и удаляет из него исходный код событий и методов, который хранится в файлах форм SCX и визуальных библиотек VCX. Удаление исходного кода позволяет получить файл пользовательского приложения меньших размеров и более защищенный от вскрытия.
    Для запуска программы используйте следующий синтаксис:

DO BUILDAPP [WITH ProjectName [, AppFileName [, DebugMode [, BuildEXE]]]]

    Здесь параметр ProjectName задает имя проекта. Параметр AppFileName - имя файла пользовательского приложения, причем указываемое расширение (APP или EXE) будет устанавливать тип создаваемого файла. Параметр DebugMode имеет логический тип и позволяет включить или отключить отладочный режим (для SET DEBUG ON параметр DebugMode должен быть равен .T., а для SET DEBUG OFF - .F.). Если параметр BuildEXE равен .T., то будет создаваться выполняемый EXE-файл.
    Программа BUILDAPP выполняет следующие действия:

  1. Определяет местоположение файлов.
  2. Открывает проект.
  3. Создает файл пользовательского приложения на основе первоначального файла проекта для проверки того, что весь исходный код откомпилирован и объектный код записан в соответствующие поля файлов SCX и VCX. Для завершения работы программы проект не должен генерировать ошибок во время построения пользовательского приложения.
  4. Физически удаляет помеченные для удаления записи в файлах VCX.
  5. Переносит исходный код из файлов SCX и VCX в массив.
  6. Перестраивает файл пользовательского приложения.
  7. Восстанавливает исходный код в файлах SCX и VCX, возвращая тем самым проект в первоначальное состояние.

    Теперь скажем несколько слов о двух типах пользовательской программы, которые можно создать в Visual FoxPro.
    APP-файл предназначен для работы в среде СУБД. Таким образом, компьютер, на котором будет работать ваша программа, должен быть оснащен копией Visual FoxPro.
    EXE-файл на несколько десятков килобайт больше APP-файла, но для своей работы не требует наличия на компьютере Visual FoxPro. Этот файл работает совместно с библиотекой поддержки VFP300.ESL. EXE-файл работает несколько быстрее, чем APP, вероятно, за счет того, что требует меньшего количества ресурсов.
    При выборе типа файла для пользовательского приложения необходимо иметь в виду, что библиотека поддержки не включает некоторые функции СУБД. Следовательно, в приложении, распространяемом в виде EXE-файла, не должны присутствовать эти исключенные функции.
    Из меню Visual FoxPro не доступны следующие возможности:

  • Database
  • Form
  • Menu
  • Program
  • Project
  • Query
  • Table

    Ниже приведен список команд, при выполнении которых в пользовательском приложении произойдет ошибка "Feature not available" (функция не доступна).
    Команды, не доступные при использовании библиотеки поддержки:

BUILD APP MODIFY FORM
BUILD EXE MOFIFY MENU
BUILD PROJECT MODIFY PROJECT
COMPILE MODIFY QUERY
CREATE FORM MODIFY STORED PROCEDURE
CREATE MENU MODIFY STRUCTURE
CREATE QUERY MODIFY VIEW
CREATE VIEW SUSPEND
FILER SET
MODIFY CONNECTION SET STEP
MODIFY DATABASE

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

ADDLABEL.APP
AUTONAME.PRG
BROWSER.APP
BUILDAPP.PRG
BUILDAPP.SCT
BUILDAPP.SCX
BUILDER.APP
CONPROCS.PRG
CONVERT.APP
CONVERT.H
CONVERT.PJT
CONVERT.PJX
CONVERT.PRG
CVTALERT.H
CVTSCX.H
FD3.FLL
FDKEYWRD.CDX
FOREIGN.H
FOREIGN.PRG
FORMPARM.PRG
FOXHELP.DBF
FOXHELP.FPT
FOXHELP.HLP
FPCNEW.PRG
GENDBC.PRG
GENERIC.PRG
GENMENU.PRG
HC35.ERR
HC35.EXE
IMAGEDIT.EXE
IMAGEDIT.HLP
JD.FKY
JD.PRG.
LOCWORD.H
LOCWORD.PRG
MIGDB4.H
MIGDB4.PRG
MIGNAVPR.TXT
MMSETUP.PRG
MRBC.EXE
MSGRAPH.HLP
MSINFO.EXE
PRO_EXT.H
PUTNAME.PRG
RESERVED.FLL
SHED.EXE
SHED.HLP
SPELLCHK.APP
TRANSPRT.PRG
VFP.EXE
WINAPIMS.LIB
WIZARD.APP
WIZARD.FLL
WZFORM.APP
WZFOXDOC.APP
WZGRAPH.APP
WZIMPORT.APP
WZMAIL.APP
WZPIVOT.APP
WZQUERY.APP
WZREPORT.APP
WZSETUP.APP
WZTABLE.APP
WZUPSIZE.APP

    В Visual Basic процедура подготовки пользовательского приложения очень похожа на только что описанную для Visual FoxPro. В Visual Basic мы можем получить только EXE-файл. Для этого достаточно выбрать команду Make EXE File в меню File. Подготовка дистрибутивного комплекта дискет в Visual Basic выполняется с помощью отдельного приложения - Application Setup Wizard, представленного на рис. 12.12. Это приложение работает аналогично Setup Wizard в Visual FoxPro и путем выполнения семи шагов позволяет программисту быстро определить набор файлов, необходимый для работы приложения на компьютере пользователя.


Рис. 12.12.
Глава 11 || Содержание || Приложение 1