|
Навигация
|
Главная » Sql dbms_utility.format_error_backtrace - отслеживание ошибок в pl/sqlИсточник: orahome Петрелевич Сергей Часто при обработке исключений в pl/sql разработчики ограничиваются использованием встроенной функцииsqlerrm, однако в Oracle есть и другие интересные средства для обработки ошибок. Одно из этих средств - функция dbms_utility.format_error_backtrace.Функция dbms_utility.format_error_backtrace возвращает список вызовов функций и процедур от места генерации исключения до места его обработки. Для рассмотрения работы dbms_utility.format_error_backtrace создадим тестовый пакет с процедурами, которые подобно матрешкам вызываются одна из другой.
Пример 1. dbms_utility.format_error_backtrace в каждом обработчике исключенийВ первом примере функция dbms_utility.format_error_backtrace вставлена в обработчики исключений каждой процедуры.
testProc1 testProc2 testProc3 testProc4 testProc4 error:ORA-01403: no data found stack:ORA-06512: at "DEV.ERR", line 38 testProc3 error:ORA-01403: no data found stack:ORA-06512: at "DEV.ERR", line 43 ORA-06512: at "DEV.ERR", line 27 testProc2 error:ORA-01403: no data found stack:ORA-06512: at "DEV.ERR", line 32 ORA-06512: at "DEV.ERR", line 16 testProc1 error:ORA-01403: no data found stack:ORA-06512: at "DEV.ERR", line 21 ORA-06512: at "DEV.ERR", line 6Видно, что функция dbms_utility.format_error_backtrace выводит пакет, в котором сработало исключение и номер строки. Надо отметить, что в данном примере и строки вида dbms_output.put_line('testProc3 error:'//dbms_utility.format_error_stack); отлично формируют стек ошибки,dbms_utility.format_error_backtrace лишь уточняет конкретную строку. Пример 2. dbms_utility.format_error_backtrace в стартовой процедуре, во всех процедурах есть обработчики исключенийРассмотрим другой пример.На этот раз dbms_utility.format_error_backtrace будет в стартовой процедуре, из которой вызываются другие. В других процедурах будут обработчики исключений, но в них не будет вызоваdbms_utility.format_error_backtrace.
testProc1 testProc2 testProc3 testProc4 testProc1 error:ORA-01403: no data found stack:ORA-06512: at "DEV.ERR", line 19 ORA-06512: at "DEV.ERR", line 6Информации не очень-то много. Складывается впечатление, что ошибка возникла в 19 строке кода, хотя правильное место - строка 34. Причина в том, что dbms_utility.format_error_backtrace показывает стек не с места фактического появления ошибки, а с мест ее последнего перехвата. В нашем случае это процедура proc2, строка 21. Получается, в этом случае dbms_utility.format_error_backtrace ни только не помогает, а еще и мешает, запутывает следы. Пример 3. dbms_utility.format_error_backtrace в стартовой процедуре, в других процедурах нет обработчиков исключенийНа этот раз все исключения обрабатываются только в одном месте - вызывающей функции, и только в ней используется dbms_utility.format_error_backtrace.
testProc1 testProc2 testProc3 testProc4 testProc1 error:ORA-01403: no data found stack:ORA-06512: at "DEV.ERR", line 32 ORA-06512: at "DEV.ERR", line 25 ORA-06512: at "DEV.ERR", line 18 ORA-06512: at "DEV.ERR", line 7На этот раз информации куда больше. По выводу функции dbms_utility.format_error_backtrace можно точно отследить, что ошибка появилась в функции testProc4, строка 32, и какие процедуры выполнялись. Из этих примеров можно вывести две основные тактики применения dbms_utility.format_error_backtrace. Эту функцию надо вставлять в каждый обработчик исключений или обрабатывать все исключения в одной точке - стартовой процедуре(функции). JDataStore 7 (download). Политика Sybase по поддержке версий ПО. Будет ли повышаться зарплата ИТ-специалистов в будущем?. Наболевшее об исходном коде объектов БД. Моделирование групп объектов в Oracle. Главная » Sql |
© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено. |