Программирование >>  Программирование на языке c++ 

1 ... 86 87 88 [ 89 ] 90 91 92 ... 159


7. ВЫЯВЛЕНИЕ

И УСТРАНЕНИЕ ОШИБОК

7.1. Общие сведения об исключениях и их обработке

Рассмотрим программы, которые используют библиотеки классов. Разработчик библиотеки может предложить методы выявления ошибок, возникающих на этапе выполнения программы. Покажем на примере, как это можно сделать. Пусть заданы некоторый класс К и множество операций (операторов) О, переопределенных для этого класса. Пусть одна из этих операций Q была доопределена функцией operator. Опишем объект к класса К и рассмотрим операцию вида к[...]. При описании объекта мы можем задать диапазон допустимых индексов для выражения к[...], например, k[0],...,k[N-l], где N - число допустимых элементов. Рассмотрим выражение k[i]. В классе К можно заранее предусмотреть проверку правильности значения i, т. е. 0<=i<=(N-l). Если действительное значение i не попадает в указанные границы, то оно ошибочное. Выявить такие ошибки можно только на этапе выполнения программы, и разработчик библиотеки знает, как это сделать. Однако он не знает, что делать дальше, поскольку об этом может знать только разработчик программы, использующий эту библиотеку. С другой стороны, разработчик программы не знает, как найти эти ошибки, а даже если и знает, то это требует введения в программу специальных фрагментов, осуществляющих поиск ошибок, что приводит к ее усложнению и ухудшению читабельности.

В языке С++ вводится понятие исключения (exception), которое использует специальный механизм для выявления и устранения ошибок рассмотренного типа. Исключение, или



исключительная ситуация, - это что-то особенное или ненормальное в программе. Наиболее общим (хотя в то же время и частным) случаем исключения является ошибка. Однако ниже будет показано, что исключение - это более общее, чем ошибка, понятие и оно может возникать и тогда, когда в программе нет ошибок.

Основную идею исключения можно выразить следующим образом. Если в программе (библиотечной) возникает некоторая неразрешимая ситуация, то генерируется исключение. Это означает, что вместо нормального продолжения программы последующие операции будут выполняться по другой цепочке, связанной с обработкой возникшей исключительной ситуации. Генерация исключения предполагает, что кто-то непосредственно или косвенно может обработать исключение, т. е. либо прервать программу (если возникшая ситуация действительно неразрешима), либо что-то изменить и продолжить нормальное выполнение программы. Программа (программа пользователя), которая знает, как разрешить возможные проблемы, устанавливает специальный индикатор, указывающий на начало цепочки, в которой должна обрабатываться возникшая исключительная ситуация. Рассмотрим, как можно выявить ошибки в классе string, рассмотренном в § 5.6.

class string {

cliar* pointer to string;

unsigned size; public:

class range { };

char& operator[](int);

..................... };

Здесь функция operatorQ будет выявлять исключения, а класс range будет некоторым индикатором (сигналом) исключения. Если возникнет ошибка индекса, то range сигнализирует: есть исключение . В результате приостанавливается нормальное выполнение другой программы и осуществляется автоматический переход к фрагменту этой другой программы, который обрабатывает исключение. Это можно в некоторой степени отождествить с прерываниями в процессоре (микропроцессоре). Если возникает исключительная ситуация (например, попытка деления на нуль), то вырабатывается ап-



паратный сигнал (индикатор), говорящий о том, что есть исключение . В результате прерьшается вьшолняемая программа и осуществляется автоматический переход к другой программе (обработчику прерывагшя), которая обрабатывает эту ситуацию. Рассмотрим возможный текст функции operator:

char& string::operator[]{int i)

{ if ({i<0)(i>=size)) throw rangeQ;

return pointer to string[i]; }

Здесь выражение throw range(); сигнализирует о возникновении исключения. Класс range используется как индикатор исключения за пределами класса string. В частности, объект этого класса может получать и хранить некоторую дополнительную информацию об исключении, например ошибочный индекс (соответствующие вопросы будут рассмотрены ниже в этой главе).

Все сказанное выше относится к библиотечным классам, хотя, в общем случае, это не обязательно. Рассмотрим теперь программу, которую условно назовем программой пользователя. Предположим, что эта программа знает, как обработать исключение, поэтому при возникновении исключения в библиотечной программе она хочет перехватить управление и выполнить некоторую специальную последовательность (цепочку) операций, связанных с обработкой исключения. Общая структура этой программы будет такая:

void main(void)

{ string my string(i<);

try {

Выполнение каких-то операций с объектом my string }

catch(string::range) {

Это обработчик исключения, для которого установлен индикатор string::range (для которого возник сигнал string: :range), т. е. этот фрагмент будет исполнен лишь тогда, когда в выражении my string[i] бьшо использовано ошибочное значение индекса i.



1 ... 86 87 88 [ 89 ] 90 91 92 ... 159

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика