PL/SQL определяет специальный обработчик исключительных ситуаций — WHEN OTHERS. Обработчик OTHERS (другие) выполняется для всех инициированных исключительных ситуаций, которые не обработаны другими предложениями WHEN, определенными в текущем разделе исключений (аналогично базовому классу Exception в Java). Он всегда
должен быть последним обработчиком в блоке, чтобы все предыдущие (и
более специальные) обработчики были перед этим просмотрены. WHEN OTHERS будет перехватывать все исключения, предварительно определенные и определяемые пользователем. Обработчик OTHERS рекомендуется указывать на самом высоком уровне программы (в самом внешнем блоке) для обеспечения распознавания всех возможных ошибок. Иначе ошибка будет распространяться в вызывающую среду (см. ниже раздел "Распространение исключительных ситуаций"). Это может привести к нежелательным последствиям, таким как откат текущей транзакции.
В этом примере обработчик OTHERS регистрирует факт возникновения ошибки, но не определяет ее. Сведения об ошибке, приведшей к установлению исключительной ситуации, обрабатываемой OTHERS, можно получить при помощи предопределенных функций SQLCODE и SQLERRM (см. ниже).
Совет
Не используйте в коде обработчик исключительных ситуаций типа WHEN OTHERS THEN NULL; так как он будет молчаливо перехватывать все неожиданные ошибки, не сообщая о том, что они произошли. Хороший обработчик OTHERS должен регистрировать ошибку и, возможно, дополнительную информацию для последующего анализа.
SQLCODE и SQLERRM При использовании обработчика OTHERS бывает полезно знать, какая ошибка Oracle установила исключительную ситуацию. Можно регистрировать не только факт возникновения ошибки, но и ее тип, если это необходимо для выполнения конкретных действий. В PL/SQL такие сведения получают при помощи двух встроенных функций: SQLCODE и SQLERRM. SQLCODE возвращает код текущей ошибки, a SQLERRM — текст сообщения об ошибке. Для исключений, определяемых пользователем, SQLCODE возвращает 1, a SQLERRM возвращает "User-defined Exception" (определенное пользователем исключение).
Внимание
Функция DBMSUTILITY. FORMAТ_ERROR_STACK также возвращает код текущей ошибки и может быть использована в дополнение к функции SQLERRM (см. приложение А).
Ниже приводится полный текст блока PL/SQL, в котором используется обработчик исключительных ситуаций OTHERS.
сама вызывает стандартную исключительную ситуацию Во избежание этого используется встроенная функция SUBSTR, обеспечивающая присваивание переменной v_ErrorText не более чем 200 символов. О SUBSTR и о других встроенных функциях PL/SQL рассказывается в главе 5.
Заметим, что значения функций SQLCODE и SQLERRM сначала присваиваются локальным переменным, и только потом эти переменные указываются в SQL-операторе. Данные функции являются процедурными, поэтому их нельзя использовать непосредственно в SQL-операторе.
Функция SQLERRM может принимать числовой аргумент. В этом случае она возвращает текст сообщения об ошибке, код которой равен заданному числу. Аргумент должен всегда быть отрицательным. Если аргумент SQLERRM равен нулю, возвращается сообщение
Если в SQLERRM передается положительное значение, отличное от
100, выдается сообщение
При вызове в обработчике функция SQLCODE возвращает отрицательное число, обозначающее ошибку Oracle. Единственным исключением является ошибка "ORA-1403: no data found", когда SQLCODE возвращает +100. Если SQLERRM без аргументов вызывается из выполняемого раздела
A SQLCODE возвращает 0. Все эти ситуации показаны в следующем примере:
блока, она всегда возвращает сообщение.
Совет
Обычно лучше использовать SQLERRM без параметров (а не передавать такой параметр, как SQLCODE). Версия без параметров вернет полное сообщение об ошибке с любой строкой подстановки, например, с именем ограничения в случае ошибки ORA-1 (см. предыдущий пример).
< Предыдущая | Следующая > |
---|