Область действия исключительной ситуации аналогична области действия переменной. Если исключительная ситуация, определенная пользователем, будет передана из блока и окажется вне области своего действия, ссылаться на нее по имени станет невозможно. Рассмотрим пример:
Если сообщение об ошибке, определяемой пользователем, нужно передать из блока, рекомендуется описывать исключительную ситуацию в модуле так, чтобы она была видима вне этого блока, или следует воспользоваться функцией RAISE_APPLICATION_ERROR (см. ниже). Если создать модуль Globals и описать в нем e_UserDefinedException, то эта исключительная ситуация будет видима и во внешнем блоке. Например:
С учетом созданного модуля Globals можно переписать рассмотренный выше фрагмент программы следующим образом:
помимо исключительных ситуаций, в модуле Globals можно объявить общие таблицы, переменные и типы PL/SQL (см. главы 9 и 10).
Отслеживание всех исключительных ситуаций
Не следует допускать возникновения в программах исключительных ситуаций, которые не обрабатываются. Можно воспользоваться обработчиком OTHERS, создав его на самом верхнем уровне программы. Например, если этот обработчик будет регистрировать факт и время возникновения каждой ошибки, то ни одна ошибка не будет оставлена без внимания:
Выявление места возникновения ошибки
Иногда трудно определить, какой из SQL-операторов стал причиной ошибки, так как раздел исключительных ситуаций анализируется для всего
блока. Рассмотрим пример:
BEGIN
SELECT . . . SELECT . . .
SELECT . . .
EXCEPTION
WHEN NO_DATA_FOUND THEN
- Какой из операторов SELECT породил эту исключительную ситуацию?
END;
Решить эту проблему можно двумя способами. Первый — создание счетчика, указывающего на SQL-оператор:
DECLARE
— Переменная для хранения номера оператора выбора v_SelectCounter NUMBER :=1; BEGIN
SELECT . . .
v_SelectCounter := 2; SELECT , . .
v_SelectCounter := 3;
SELECT . . . EXCEPTION
WHEN N0_DATA_F0UND THEN
INSERT INTO log_table (info) VALUES ('No data found in select' [ v_SelectCounter);
END;
Второй способ — размещение каждого оператора в собственном внутреннем блоке:
< Предыдущая | Следующая > |
---|