Обработка исключений Обработка исключений
Обработка исключений
Обработка исключений (exception handling) – это механизм, который позволяет структурировать программу определенным образом для того, чтобы отделить часть обработки ошибок от других частей программы. Концептуально, обработка исключений включает в себя две основные группы действий, которые связаны с тремя специальными ключевыми словами (try, throw, catch)
Обработка исключений • Выброс исключений (throw) – прекращение исполнения первичного кода из-за ошибки и извещение об ошибке. Выброс исключений происходит в специальном блоке try. • Выброс исключений (catch) обеспечивает обработку случая исключения соответсвенно типу исключения. Перехват исключения происходит сразу за блоком try, в котором мог бы произойти выброс исключений.
Обработка исключений Практически обработку ошибок можно реализовать также не используя механизм обработки исключений, но в этом случае самому программисту необходимо создавать конструкции для отправки сообщений об ошибке в место обработки ошибок, которое могло бы выражаться в виде функций специального назначения, или как дополнительные параметры функции, которые были бы предназначены для пересылки сообщений об ошибке между модулями.
Обработка исключений Особенно удобна обработка исключений бывает в случаях, когда ошибка констатирована на одном, а обработана на другом уровне иерархии вызова функции. В то же самое время, нужно понимать, что использование стандартного метода обработки исключений связано с использованием дополнительных ресурсов.
Блок ‘try’ – это часть программы, которая за ключевым словом try включена в блок фигурных скобок, к которому (включая функции на всех уровнях, вызванные из этого блока) относится обработка ситуаций реализованных за этим блоком исключений. try { //зона определения ситуаций исключений } Возникновение ситуаций ошибок определяет сам программист – инфраструктура обработки исключений только помогает отправить сообщения об ошибках в место обработки.
Выброс исключений ‘throw’ Используя оператор throw, определенное сообщение об ошибке (число, текст, объект) отправляется на перехват в соответствующий блок catch. Выбрасывая исключения, программа в соответствующем месте прерывается и обеспечивается окончание вызванных функций на всех уровнях (и, соответственно, ликвидация локальной переменной) для того, чтобы дойти до блока обработки ошибок.
Выброс исключений ‘throw’ Выбрасывая исключение важно не только значение, но и тип, т. к. функция обработки исключения выбирается только соответсвенно выкидываемому типу. throw "ERROR: Division by zero"
Обработка исключений ‘catch’ За блоком try находится последовательность блоков catch, которая напоминает функцию без возвращаемого типа и блок параметров, таким образом обеспечивая обработку исключения соответственно типам. catch ( parameter ) {catch_body} catch ( . . . ) {catch_body} catch(…) отлавливает любые другие неописанные ошибки
Обработка исключений ‘catch’ • Если блок catch с соответствующим типом не существует, тогда обработка исключения происходит в блоке catch(. . . ). • Если блок catch(. . . ) не существует, тогда ошибка пересылается в ближайший внешний блок обработки ошибок, но если и такой не существует, то программа заканчивается ошибкой.
Обработка исключений Структура блоков try, throw, catch try { . . . if (вид ошибки nr. 1) throw some_exception 1; . . . if (вид ошибки nr. 2) throw some_exception 2; . . . } catch (T 1 exc) { /* обработка исключения с типом T 1 */ } catch (T 2 exc) { /* обработка исключений с типом T 2 */ } catch (. . . ) { /* обработка других исключений */ }
Обработка исключения - пример Следующий пример демонстрирует механизм обработки исключения для функции process, которая считает значение выражения x + y / z. Определяя значение функции, не должны нарушаться такие условия – z не равно 0, и слагаемые в пределах 0. . 100
Обработка исключений - пример 1. #include
Обработка исключений - пример 17. void process (double x, double y, double z) 18. { 19. try 20. { 21. cout << x_plus_y_over_z (x, y, z) << endl; 22. } 23. catch (const char *error_text) 24. { 25. cout << error_text << endl; 26. } 27. catch (int error_num) 28. { 29. cout << "ERROR: Addend too big" << endl; 30. } 31. catch (. . . ) 32. { 33. cout << "ERROR: Unknown error" << endl; 34. } 35. } 21. Вызываем функцию x_plus_y_over_z в блоке try, что означает обработку всех реализованных исключений в этом блоке.
Обработка исключений - пример 17. void process (double x, double y, double z) 18. { 19. try 20. { 21. cout << x_plus_y_over_z (x, y, z) << endl; 22. } 23. catch (const char *error_text) 24. { 25. cout << error_text << endl; 26. } 27. catch (int error_num) 28. { 29. cout << "ERROR: Addend too big" << endl; 30. } 31. catch (. . . ) 32. { 33. cout << "ERROR: Unknown error" << endl; 34. } 35. } 23. Лoвит исключения типа char* 27. Лoвит исключения типа int 31. Ловит исключения всех остальных типов
Обработка исключений - пример 36. int main () 37. { 38. process (2, 4, 0); // 2 + 4 / 0 39. process (999, 4, 0. 5); // 999 + 4 / 0. 5 40. process (-2, 4, 0. 5); // -2 + 4 / 0. 5 41. process (2, 4, 0. 5); // 2 + 4 / 0. 5 42. system("pause"); 43. return 0; 44. } 38. -41. тестирование try, throw, catch
Обработка исключений Механизм обработки исключений предназначен не для выявления ошибок в программе, а для отправки сообщений о выявленных ошибок в специальное место обработки.
Практическая работа 1. Проведите обработку исключений вводя возраст людей. Значение не может быть негативным и оно должно быть в интервале 0 -200 2. Функция перемножает два числа типа int. Проведите проверку на выход из границ типа int. 3. Опишите процесс вычисления заданного выражения 3+2*√х – 4 / x Обработайте ошибку извлечения квадратного корня из отрицательного числа, и деления на 0.
08_Обработка исключений.ppt
- Количество слайдов: 18

