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

« Назад

Рассмотрим следующий код:

x = –5

a = Sqrt(x)

b = x * x

Поскольку в VFP параметр функции SQRT( ) не может быть меньше нуля, то при выполнении приведенного кода возникнет ошибка. При этом стандартный обработчик ошибок VFP прервет исполнение программы и выдаст показанное на рис. 7.1 сообщение.

122.1.-Обработка-ошибки-в-VFP

Рис. 7.1. Обработка ошибки в VFP

Стандартный обработчик ошибок можно заменить пользовательским.

Команда

ON ERROR [Command]

задает команду Command, выполняемую при возникновении ошибки VFP.

Как правило, Command – это вызов пользовательской программы или процедуры.

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

При использовании ON ERROR без параметра Command восстанавливается стандартный обработчик ошибок VFP.

Процедура-обработчик ошибки не должна содержать команду ON ERROR. Если же такая команда в ней все же присутствует, то восстанавливается стандартный обработчик ошибок VFP.

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

Таблица 7.3

Функции для локализации и расшифровки ошибки

Функция

Описание

ERROR( )

Возвращает номер последней ошибки; результат либо передается процедуре-обработчику ошибки, указанной в команде ON ERROR, либо функция вызывается в этой процедуре. Соответствующее сообщение об ошибке возвращает функция MESSAGE( )

MESSAGE([1])

Возвращает, если вызвана без параметра, строку, содержащую описание ошибки. При вызове с параметром функция вернет текст, имеющийся в строке программного кода, в которой возникла ошибка. Вызов с параметром нельзя использовать, если при компиляции (команда COMPILE) использована опция NODEBUG

LINENO([1])

Возвращает, если вызвана без параметра, номер строки с ошибкой относительно первой строки главной программы. При вызове с параметром функция вернет номер строки с ошибкой относительно первой строки текущего программного компонента.
Если работа программы приостановлена (команда SUSPEND), то LINENO( ) вернет номер выполняемой в этот момент строки; LINENO( ) вернет 0, если работа программы прервана (команда CANCEL)

PROGRAM([nLevel])

Возвращает, если параметр nLevel опущен, имя выполняемой программы. В случае ошибки возвращает имя программы, в которой произошла ошибка.
Чтобы отобразить иерархию вызова выполняемый программы, следует задать число отображаемых уровней (параметр nLevel). Это число не должно быть более 128.
Если nLevel равен 0 или 1, то PROGRAM( ) возвращает имя программы, находящейся на верхнем уровне иерархии. Если значение параметра nLevel превышает число уровней иерархии, функции вернет пустую строку.
Если для nLevel задать –1, то PROGRAM( ) вернет номер текущего уровня программы. PROGRAM(–1) вернет 0, если вызвана из командного окна

SYS(16 [, nLevel])

Аналогична функции PROGRAM( ), однако в отличие от последней возвращает вдобавок имя файла (с указанием пути), в котором расположена выполняемая процедура или функции. Имя файла не возвращается, если выполняемая программа является частью приложения.
Описание параметра nLevel дано при рассмотрении функции PROGRAM( )

SYS(2018)

Возвращает параметр, включаемый в строку сообщения об ошибке. Тип результата – символьный.
Употребляется для получения дополнительных сведений об ошибке. Например, если в выражении используется не существующая переменная, то в сообщение об ошибке включается дополнительный, возвращаемый SYS(2018) параметр, содержащий имя этой переменной

Пример 1. Иллюстрируется работа команды ON ERROR на коде, имеющем 2 ошибки.

&& Очищаем окно VFP

clear

&& ErrorHandler – имя процедуры, обрабатывающей ошибки

on error do ErrorHandler with Error( ), Message( ), Message(1), Lineno( ), Program( ), Sys(16)

x = –5

&& Ошибка 1. Попытка извлечь корень из отрицательного числа

a = Sqrt(x)

&& Ошибка 2. Использование несуществующей переменной a

b = a * x

&& Восстанавливаем заданный по умолчанию обработчик ошибок

on error 

procedure ErrorHandler

parameters err, mes, mes1, lineNumber, progName, fileName

if Set(‘TEXTMERGE’) = ‘OFF’

    set textmerge on show

endif

&& Выводим дополнительно текст об ошибках в файл

set textmerge to d:a.txt additive

Номер ошибки: <<Transform(err)>>

Описание ошибки: <<mes>>

Локализация ошибки:

оператор: <<Upper(mes1)>>

номер строки: <<Transform(lineNumber)>>

имя программы: <<progName>>

имя файла: <<fileName>>

&& Закрываем файл, содержащий сообщения об ошибках

Fclose(_TEXT)

endProc

Сообщения, сгенерированные процедурой ErrorHandler:

Номер ошибки: 61

Описание ошибки: SQRT( ) argument cannot be negative

Локализация ошибки:

оператор: A = SQRT(X)

номер строки: 8

имя программы: TEST

имя файла: D: TEST.FXP

Номер ошибки: 12

Описание ошибки: Variable ‘A’ is not found

Локализация ошибки:

оператор: B = A * X

номер строки: 10

имя программы: TEST

имя файла: D: TEST.FXP

Пример 2. Печатаются значения элементов массива, сгенерированного функцией AERROR( ), при попытке добавить запись в таблицу Authors.dbf с недопустимым (отрицательным) значением поля AuthorId.

Встроим в таблицу Authors.dbf триггер вставки, содержащий указанное на рис. 7.2 выражение.

122.2.-Триггер-вставки-таблицы-Authors.dbf

Рис. 7.2. Триггер вставки таблицы Authors.dbf

Выполним с тем же обработчиком ошибок следующий код:

clear

on error do ErrorHandler

close databases

open database ‘d:HomeLibraryHomeLibrary’

&& Открываем таблицу Authors.dbf, активизируя индекс AuthorId

use Authors order tag AuthorId

m.AuthorId = –123

m.Author = ‘Федоров Алексей Георгиевич’

m.InputDate = {^2005–01–01}

if not Seek(m.AuthorId)

insert into Authors from memvar

endif

on error 

procedure ErrorHandler

&& Направляем сообщения в окно VFP и в файл d:a.txt

if Set(‘CONSOLE’) = ‘OFF’

    set console on

endif

set alternate to d:a.txt additive

set alternate on

nRows = Aerror(aErrorArray)

for k = 1 to nRows

    ? ‘Номер ошибки: ‘, aErrorArray(k, 1)

    ? ‘Описание ошибки: ‘, aErrorArray(k, 2)

    if not IsNull(aErrorArray(k, 3)) then

  ? ‘Параметр ошибки: ‘, aErrorArray(k, 3)

    endif

    if not IsNull(aErrorArray(k, 4)) then

    ? ‘Номер рабочей области: ‘, aErrorArray(k, 4)

    Endif

    if not IsNull(aErrorArray(k, 5)) then

    do case

case aErrorArray(k, 5) = 1

? ‘Ошибка при добавлении данных’

case aErrorArray(k, 5) = 2

? ‘Ошибка при обновлении данных’

case aErrorArray(k, 5) = 3

? ‘Ошибка при удалении данных’

    endCase

    endif

endFor

&& Закрываем файл, содержащий сообщения об ошибках

set alternate to

endProc

Сообщения, сгенерированные процедурой ErrorHandler:

Номер ошибки: 1539

Описание ошибки: Trigger failed

Номер рабочей области: 1

Ошибка при добавлении данных

После обнаружения ошибки для ее обработки употребляются в том числе приведенные в табл. 7.4 команды.

Таблица 7.4

Команды CANCEL, RESUME, RETRY, RETURN и SUSPEND

Команда

Описание

CANCEL

Прекращает исполнение текущей программы; все ее PRIVATE-переменные освобождаются

RESUME

Возобновляет исполнение приостановленной командой SUSPEND программы

RETRY

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

RETURN [eExpression
               
| TO MASTER

                | TO ProcedureName]

Передает управление вызывающей программе, возвращая значение eExpression. Управление передается вызывающей программе верхнего уровня, если задана опции TO MASTER, или процедуре ProcedureName, если задана последняя опция команды.
Если команда RETURN опущена или употреблена без eExpression, то функция вернет .T.
RETURN освобождает все PRIVATE-переменные прерванной программы

SUSPEND

Приостанавливает выполнение текущей программы. После выполнения SUSPEND имеется возможность выполнить необходимые для прояснения ситуации действия: проверить значения переменных, открыть окно трассировки или отладки и т. д. Работа приостановленной программы возобновляется командой RESUME

При необходимости сведения об ошибке можно очистить.

Команда

CLEAR ERROR

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

AERROR( ) – будет возвращать 0;

ERROR( ) – будет возвращать 0;

MESSAGE( ), MESSAGE(1) и SYS(2018) – будут возвращать чистую строку.

Команду CLEAR ERROR нельзя употреблять внутри конструкции TRY … CATCH … FINALLY: объект-исключение после употребления CLEAR ERROR внутри конструкции может стать недоступным.

Задает команду, которая выполняется при возникновении ошибки.

Синтаксис:

ON ERROR
	[Command]

Параметры:
Command
Задает команду Visual FoxPro, которую следует выполнить. После того как она выполнится, возобновляется выполнение программы со строки, непосредственно следующей за строкой, вызвавшей ошибку. Однако если в процедуру обработки ошибок включена команда RETRY, то будет повторно выполнена вызвавшая ошибку строка программы.
Если команда определяет процедуру, выполняемую в случае ошибки, то с помощью функций ERROR( ), MESSAGE( ), LINENO( ) и PROGRAM( ) можно передать в эту процедуру номер ошибки, сообщение об ошибке, номер строки программы и имя программы. Эту информацию можно использовать при устранении причины ошибки.

Комментарии:
Когда во время выполнения программы обнаруживается ошибка, Visual FoxPro выполняет команду, заданную с помощью ON ERROR. Обычно в команде ON ERROR используется команда DO, инициирующая процедуру обработки ошибок.
Используйте ON ERROR без команды, чтобы восстановить обработчик ошибок Visual FoxPro, используемый по умолчанию.
Процедуры ON ERROR не могут быть вложенными. Если выдать команду ON ERROR внутри процедуры ON ERROR, восстанавливается обработчик ошибок Visual FoxPro, используемый по умолчанию.

Пример:

ON ERROR DO errhand WITH ;
	ERROR( ), MESSAGE( ), MESSAGE(1), PROGRAM( ), LINENO( )
*** The next line should cause an error ***
USE nodatabase
ON ERROR  && restore system error handler
PROCEDURE errhand
PARAMETER merror, mess, mess1, mprog, mlineno
CLEAR
? 'Error number: ' + LTRIM(STR(merror))
? 'Error message: ' + mess
? 'Line of code with error: ' + mess1
? 'Line number of error: ' + LTRIM(STR(mlineno))
? 'Program with error: ' + mprog

Example

A simple way to catch unhandled errors (exceptions) in a VFP application is to use the ON ERROR command near the beginning of your main program.

The following ON ERROR command calls a method in the current program called «errorHandler». The values returned by ERROR (the VFP Error Number), MESSAGE (the VFP Error Message), PROGRAM (name of the currently executing program) and LINENO (the line number of the error) are passed to the errorHandler method.

ON ERROR DO errorHandler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()

A simple errorHandler method may look like the following.

PROCEDURE errorHandler
    LPARAMETERS tnVFPErrorNumber, tcVFPErrorMessage, tcProcWithError, tnLineNumber

    STORE 'Error message: ' + tcVFPErrorMessage + CHR(13) + ;
        'Error number: ' + TRANSFORM(tnVFPErrorNumber) + CHR(13) + ;
        'Procedure with error: ' + tcProcWithError + CHR(13) + ;
        'Line number of error: ' + TRANSFORM(tnLineNumber) TO lcDetails

    MESSAGEBOX(lcDetails, 16, "Unhandled Exception")

    ON ERROR *
    ON SHUTDOWN
    CLEAR EVENTS

    QUIT
ENDPROC

You can also change and restore the error handler in between. For example, at one point you want to open all tables in a folder exclusively, and if you can’t you don’t want to continue:

procedure DoSomethingWithExclusiveLock(tcFolder)
local lcOldError, llInUse, ix && by default these variables have a value of .F.
lcError = on('error') && save current handler
on error llInUse = .T.  && new handler
local array laTables[1]  
for ix=1 to adir(laTables, addbs(m.tcFolder) + '*.dbf'))
   use (addbs(m.tcFolder)+laTables[m.ix,1]) in 0 exclusive
endfor
on error &lcError && restore old handler
if m.llInUse && couldn't get exclusive lock on all tables
   close databases all
   return
endif
* do whatever
endproc

Tip: Sometimes, especially during debugging, you would want to restore
default error handler which allows you to break and step into the code where the error has
occurred, then anywhere before where you got the error, temporarily
adding:

on error

would do this.

Функция

Описание

* Указывает начало неисполняемой строки комментариев в файле программы. && Указывает начало неисполняемого комментария внутри строки файла программы. AERROR() Создаёт массив переменных памяти, содержащий информацию о самой последней ошибке, связанной с FoxPro ,OLE или ODBC. CLEAR EVENTS Освобождает заданный элемент в памяти. DEBUG Открывает окно диалога FoxPro Debugger. ERROR() Определяет номер ошибки, которая указывает условие ON ERROR. EXTERNAL Предупреждает диспетчер проектов о неопределённой ссылке. LINENO Определяет номер строки выполняемой программы. MESSAGE Определяет строку сообщения о текущей ошибке. NOT |*| && Указывает на неисполняемые комментарии в программе. ON ERROR Выполняет программу (обычно передача управления в программном выполнении) ON READERROR Выполняет подпрограмму после входной ошибки. ON() Возвращает команду, присвоенную ON ERROR,ON ESCAPE,ON KEY, ON KEY LABEL, ON PAGE, ON READERROR. PROGRAM() Определяет имя программы, которая выполняется в данный момент или, может быть, имя программы, которая была выполнена, когда произошла последняя ошибка. RETRY Перевыполняет последнюю командную строку, которую уже пробовали выполнить. SET DEBUG Разрешает или запрещает доступ к окнам отладки и трассировки. SET DEVELOPMENT Сравнивает время и дату создания программного файла и его компилированного объектного файла.(Определяет, выполняется ли его наиболее современная версия программы) SET DOHISTORY Посылает команды из программы в командное окно по мере выполнения программы. SET ECHO Делает возможным / невозможным выход исходной программы в окно трассировки SET STEP Делает возможным / невозможным пошаговое выполнение программы. SET TALK Делает возможным / невозможным отображение результатов команды на экране. SET TRBETWEEN Разрешает или запрещает трассировку между точками останова в окне трассировки. SYS(16) Определяет имя программы, которая выполняется. SYS(18) Определяет имя поля, вводимого командой @ …GET, когда была нажата оперативная клавиша, назначенная ON KEY. SYS(2018) Возвращает параметр сообщения об ошибке. VARREAD() Определяет имя вводимого поля, когда была запущена текущая подпрограммаON KEY. WAIT Приостанавливает работу FoxPro до посылки символа с клавиатуры, необязательно сохраняя ввод в переменной памяти.

converted to PDF by HupBaH9I

End Sub

Глава 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»

converted to PDF by HupBaH9I

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.

converted to PDF by HupBaH9I

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. Для этого выполните следующие действия:

converted to PDF by HupBaH9I

Рис. 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.

converted to PDF by HupBaH9I

Рис. 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 более универсально, так как она будет обработана не зависимо от места возникновения ошибки.

converted to PDF by HupBaH9I

Проверить реакцию программы обработки ошибок можно, искусственно создав ошибочную

ситуацию с помощью команды

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. Однако, как и в

converted to PDF by HupBaH9I

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

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])

Соседние файлы в предмете Программирование на Delphi

  • #
  • #
  • #
  • #

    28.06.201440.36 Mб90Джулипн Б. “Фундаментальные алгоритмы и структуры данных.pdf

  • #
  • #
  • #

    28.06.20145.41 Mб144Тексейра С. “Delphi 5. Руководство разработчика” (1 том).pdf

Понравилась статья? Поделить с друзьями:
  • Foxconn коды ошибок
  • Fox life смотреть сериал мистер ошибка
  • Foundation ошибка при запуске
  • Fouc exe системная ошибка
  • Fotaservice asus ошибка как исправить