Распространено мнение, что только половина профессионально написанного исходного кода реализует собственно функциональность программы. Остальной код – это ведение журнала программы, сохранение отладочной информации и обработка всевозможных ошибок.
Понятие исключения
Исключением (exception) в PL/SQL называется ситуация, которая не должна возникать при нормальном выполнении программы PL/SQL.
Существует два типа исключений PL/SQL:
системные исключения (run-time system exceptions), которые автоматически инициируются виртуальной машиной PL/SQL при возникновении программных ошибок этапа выполнения;
пользовательские исключения (user-defined exceptions), объявляемые программистом в коде PL/SQL и используемые при реализации бизнес-логики.
Программной ошибкой этапа выполнения (run-time program error) называется ситуация, когда наблюдается неожиданное поведение программы, затрудняющее или делающее невозможным достижение целей пользователя. Примерами программных ошибок могут служить попытки деления на ноль, ошибки преобразования символов в числа, ошибки выполнения предложений SQL.
Пользовательские исключения инициируются в программах PL/SQL в том случае, когда на прикладном уровне возникли отклонения от стандартного процесса обработки данных. Например, при обработке поступивших данных встретился чек с отрицательной суммой покупки или не в рублях. С точки зрения правил бизнес-логики это такая же ошибка, как и деление на ноль с точки зрения правил арифметики. Для попытки деления на ноль в ходе выполнения программы системное исключение будет автоматически инициировано виртуальной машиной PL/SQL, потому что она «знает» правила арифметики. Для поступающих ошибочных платежей инициировать пользовательское исключение должен в своем коде программист PL/SQL, потому что он знает правила бизнес-логики вида «Платежи принимаются только в рублях, на положительные суммы с точностью до копеек», «Платежи принимаются только для открытой смены контрольно-кассовой машины (ККМ)» и так далее.
Таким образом, основное различие системных и пользовательских исключений заключается в том, что они инициируются по-разному. Системное исключение автоматически инициируется виртуальной машиной, происходит неожиданно и обычно его появление говорит о том, что скоро придется решать проблемы самого разного вида. С пользовательскими исключениями все гораздо спокойнее – сами исключения, их инициирование специальными командами PL/SQL в коде и штатная обработка для выправления положения заранее предусматриваются программистом при проектировании.
Правила работы с исключениями:
пользовательские исключения объявляются в разделах объявлений блоков PL/SQL и имеют имена;
системные исключения имен не имеют, они характеризуются номером ошибки;
имеется возможность объявить пользовательское исключение и с помощью директивы компилятору связать его с некоторым номером ошибки.
Несколько исключений для часто возникающих в программах PL/SQL ошибок объявлено во встроенном пакете STANDARD с привязкой к соответствующим номерам ошибок. Эти исключения называются предопределенными исключениями PL/SQL (predefined exception) и их можно использовать в любых программах PL/SQL без дополнительных объявлений.
Таблица 2.Предопределенные исключения PL/SQL.
Исключение
Описание исключения (номер ошибки)
INVALID_CURSOR
ссылка на несуществующий курсор (ORA-01001)
NO_DATA_FOUND
не найдены данные командой
SELECT INTO (ORA-01403)
DUP_VAL_ON_INDEX
попытка вставить в столбец с ограничением
на уникальность значение-дубликат (ORA-00001)
TOO_MANY_ROWS
команда SELECT INTO возвращает
более одной строки (ORA-01422)
VALUE_ERROR
арифметическая ошибка, ошибка преобразования
или усечения чисел и строк (ORA-06502)
INVALID_NUMBER
ошибка преобразования строки в число (ORA-01722)
PROGRAM_ERROR
внутренняя ошибка PL/SQL (ORA-06501)
ZERO_DIVIDE
попытка деления на ноль (ORA-01476)
Схема обработки исключений в Java
В языке программирования Java при описании работы с исключениями используется бейсбольная терминология. При возникновении исключения бросается (throws) объект-исключение. Этот объект как бейсбольный мяч пролетает через исходный код, появившись сначала в том методе, где произошло исключение. В одном или нескольких местах кода объект-исключение пытаются (try) поймать (catch) и обработать. Причем исключение можно обработать в одном месте кода полностью, а можно обработать исключение частично, выбросить его из обработчика снова, поймать в другом месте и обрабатывать дальше.
Читать дальше