Опубликован: 25.09.2009 | Уровень: специалист | Доступ: свободно
Лекция 9:

Отладка приложения

< Лекция 8 || Лекция 9: 1234 || Лекция 10 >
Аннотация: В этой лекции слушатель научится отлаживать свое приложение, используя различные способы отладки. В лекции будут рассмотрены интерфейс отладчика Forms, запуск формы в режиме отладки, а также дополнительные методы отладки с помощью процедур и функций встроенного пакета Debug.

Отладка

Разрабатывая приложение, вы так или иначе сталкиваетесь с ошибками выполнения и проектирования формы, идентифицировать которые бывает иногда просто, а иногда очень проблематично. Каждый разработчик знает, что отладка кода может занять существенную часть времени, отведенного на создание приложения. Если вы новичок в Oracle Forms, то для вас выяснение источника ошибки может превратиться в очень долгий и нервный процесс. В этой главе мы познакомимся с представленными Oracle Forms инструментами и встроенными подпрограммами для поиска источника и причины возникновения той или иной ошибки.

Методы отладки

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

  • Отображение отладочных сообщений.
  • Обработка исключительных ситуаций.
  • Компиляция и корректировка кода в редакторе PL/SQL.
  • Работа с Forms Debug Console.

Комментарии и сообщения

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

DECLARE 
 Val1 number; 
 Val2 number; 
BEGIN 
 Val1:=1/0; 
 Val2:=2+3; 
 Message(val2); 
END;

Если вы попробуете выполнить вышеописанный пример, то получите ошибку "ORA-01476". Для того чтобы узнать, какой оператор его вызвал, val1 или val2, вам достаточно закомментировать оператор val1 и попробовать выполнить программу снова.

DECLARE
 Val1 number;
 Val2 number;
BEGIN
 -- Val1:=1/0; 
 -- место предполагаемой ошибки закомментировано.
 Val2:=2+3;
 Message(val2);
END;

Выполнив этот пример, вы увидите, как после комментирования оператора val1 ошибка исчезнет и на экране появится сообщение со значением val2. Вам станет сразу ясно, какая из строк возбуждает исключительную ситуацию.

Сообщение - это еще один способ отслеживания выполняемого кода программы. Встроенная процедура MESSAGE позволяет вам выводить любое сообщение на экран. Расположив процедуру под наблюдаемым оператором и передав его в качестве параметра, вы можете узнать его значение в ходе выполнения программы. Сообщения могут выводиться в статусной строке формы, для этого свойство "Console Window" формы должно быть правильно настроено, или на экран. В предыдущем примере мы использовали сообщение для вывода на экран значения переменной.

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

SYNCHRONIZE синхронизирует экран терминала и внутреннее состояние формы, то есть SYNCHRONIZE обновляет вывод на экран (рис. 9.1) для отображения информации, которую Forms имеет в своем внутреннем представлении экрана. Другими словами, SYNCHRONIZE гарантирует вывод сообщения на экран в требуемой точке кода. Ниже приведен пример использования процедуры.

message('Сообщение 1'); 
synchronize; 
message('Сообщение 2'); 
synchronize; 
message('Сообщение 3'); 
synchronize;

PAUSE синхронизирует вывод на экран и приостанавливает работу приложения до тех пор, пока оператор не нажмет клавишу подтверждения. PAUSE выводит предупреждающее сообщение на экран (рис. 9.2).

Вывод сообщения на экран.

Рис. 9.1. Вывод сообщения на экран.
Сообщение команды PAUSE

Рис. 9.2. Сообщение команды PAUSE
message('Сообщение 1'); 
PAUSE;

Что касается ограничений, то здесь нужно заметить, что длина выводимого сообщения не может превышать 200 символов. Не злоупотребляйте сообщениями и не забывайте комментировать отладочные сообщения. Так, например, сообщение, забытое в цикле, может привести к большим неудобствам. Чрезмерное количество сообщений опасно тем, что возникшая ошибка может быть перекрыта вашим сообщением, хотя этого можно избежать, если использовать MESSAGE совместно с командой SYNCHRONIZE.

Исключительные ситуации

Исключительные ситуации - это мощная конструкция языка PL/ SQL, позволяющая разработчикам перехватывать и обрабатывать неожиданные и непредвиденные ошибки. Когда мы разрабатываем приложение, мы изначально и заведомо создаем идеальную модель, которая, как нам кажется, не содержит никаких ошибок. Если вы пишете простую программу, которая выдает результат деления двух чисел, вам и в голову не может прийти, что пользователь, работающий с вашей программой, не знает, что на 0 делить нельзя, и как следствие получает ошибку "FRM-40735: WHEN-BUTTON-PRESSED триггер вызвал необработанное исключение ORA - 01476". Ниже приведен рисунок, на котором изображен результат ошибочного действия пользователя, а также сам оператор, возбуждающий исключительную ситуацию (рис. 9.3).

BEGIN
 :result:=:delimoe/:delitel;
END;
Деление на ноль

Рис. 9.3. Деление на ноль

Обработка исключительных ситуаций

В вышеописанном примере мы вызываем ошибку ZERO_DIVIDE делением 10 на 0. В этом случае мы получаем сообщение "ORA-01476" без описания причины. Для обработки этой исключительной ситуации добавьте в ваш блок секцию EXCEPTION. В случае возникновения исключительной ситуации будут выполнены операторы, описанные в этой секции, то есть при выполнении программы обработка завершается на операторе, возбудившем исключительную ситуацию, и управление сразу передается в секцию EXCEPTION. Исключительная ситуация может быть обработана в конце любого блока BEGIN-END.

BEGIN
 :result:=:delimoe/:delitel;
 EXCEPTION
  WHEN ZERO_DIVIDE THEN :delitel:=1; 
END;

Вы также можете существенно сократить время на поиск причины ошибки, если обработаете исключительную ситуацию с помощью встроенных функций, которые отразят текст ошибки (рис. 9.4). Так, в предыдущем примере вместо текста "необработанное исключение" вы можете получить текст, дающий полное представление о причине ошибки, то есть "divisor is equal to zero".

BEGIN 
 :result:=:delimoe/:delitel;
 EXCEPTION
 WHEN ZERO_DIVIDE THEN message(sqlerrm);
END;
Сообщение об ошибке

Рис. 9.4. Сообщение об ошибке

Пользовательские исключительные ситуации

Сообщение об ошибке типа "ORA-01476: divisor is equal to zero" тоже не является показательным, так как не каждый пользователь знает английский язык, да и фраза "ORA-01476" лишняя. Для того чтобы генерировать собственные сообщения, вы можете определить собственную исключительную ситуацию. Пользовательская исключительная ситуация может быть возбуждена в любом месте блока, в котором она объявлена. Чтобы создать пользовательское исключение, достаточно в секции DECLARE объявить переменную и присвоить ей тип exception. Ниже продемонстрирован пример (рис. 9.5), в котором мы объявляем собственную исключительную ситуацию и заменяем сообщение sqlerrm.

DECLARE
myexcept exception; 
BEGIN 
IF :delitel =0 THEN
 RAISE myexcept; 
ELSE :result:=:delimoe/:delitel; 
END IF; 
EXCEPTION
 WHEN myexcept THEN 
  message('Деление на ноль. Делитель должен иметь значение, отличное от нуля'); 
END;
Пользовательская исключительная ситуация

Рис. 9.5. Пользовательская исключительная ситуация

Связывание исключительной ситуации с кодом ошибки

Сервер Oracle может связывать определенные исключительные ситуации с кодами стандартных ошибок. Чтобы связать пользовательскую исключительную ситуацию, используйте прагму EXCEPTION_INIT. Ниже приведен пример, в котором показан пример объявления прагмы.

DECLARE
myexcept exception;
pragma exception_init(myexcept,-1476); 
BEGIN
 :result:=:delimoe/:delitel; 
EXCEPTION
 WHEN myexcept THEN 
  message('Деление на ноль. Делитель должен иметь значение, отличное от нуля'); 
END;

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

Процедура RAISE_APPLICATION_ERROR ()

Процедура RAISE_APPLICATION_ERROR - это еще один способ возбуждения исключительной ситуации, который не требует предварительного объявления и может быть вызван в любом месте блока. Вы можете связать эту исключительную ситуацию с пользовательской исключительной ситуацией, используя прагму EXCEPTION_INIT. Ниже приведен синтаксис процедуры и пример ее использования.

RAISE_APPLICATION_ERROR    (номер_ошибки,    сообщение, TRUE|FALSE]);

Номер_ошибки - любое отрицательное число, которое лежит в диапазоне от [-20999, -20000].

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

TRUE | FALSE - этот параметр является необязательным; если его значение истинно, то ошибка добавляется к стеку ошибок, иначе все предыдущие ошибки будут заменены.

Неименованные исключительные ситуации

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

Обработчик OTHERS

Рис. 9.6. Обработчик OTHERS
< Лекция 8 || Лекция 9: 1234 || Лекция 10 >
Константин Лукин
Константин Лукин

ошибка: FRM47337  Tree node label can not be null

при выполнении скрипта

DECLARE
 Itree ITEM;
 top_node Ftree.Node;
 new_node Ftree.Node;
 i_value VARCHAR2(30);
BEGIN
 Itree := Find_Item('tree_block.tree_item ');
 new_node := Ftree.Add_Tree_Node(Itree, Ftree.ROOT_NODE,
   Ftree.PARENT_OFFSET, Ftree.LAST_CHILD,
   Ftree.EXPANDED_NODE, i_value, NULL, i_value);
END;

Юлия Малыгина
Юлия Малыгина
приведена функция скрытия URL отчета и ее применение, но применения так и нет
Жанбек Сарсенов
Жанбек Сарсенов
Россия, Москва, Московский Государственный Университет имени Ломоносова М.В., 2002