русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Различение особых ситуаций


Дата добавления: 2015-06-12; просмотров: 530; Нарушение авторских прав


Естественно, в программе возможны несколько различных динамических ошибок. Эти ошибки можно сопоставить с особыми ситуациями, имеющими различные имена. Так, в классе Vector обычно приходится выявлять и сообщать об ошибках двух видов: ошибки диапазона и ошибки, вызванные неподходящим для конструктора параметром:

class Vector {

int* p;

int sz;

public:

enum { max = 32000 };

class Range { }; // особая ситуация индекса

class Size { }; // особая ситуация "неверный размер"

Vector(int sz);

int& operator[](int i);

// ...

};

Как было сказано, операция индексации запускает особую ситуацию Range, если ей задан выходящий из диапазона значений индекс. Конструктор запускает особую ситуацию Size, если ему задан недопустимый размер вектора:

Vector::Vector(int sz)

{

if (sz<0 || max<sz) throw Size();

// ...

}

Пользователь класса Vector может различить эти две особые ситуации, если в проверяемом блоке (т.е. в блоке оператора try) укажет обработчики для обеих ситуаций:

void f()

{

try {

use_vectors();

}

catch (Vector::Range) {

// ...

}

catch (Vector::Size) {

// ...

}

}

В зависимости от особой ситуации будет выполняться соответствующий обработчик. Если управление дойдет до конца операторов обработчика, следующим будет выполняться оператор, который идет после списка обработчиков:

void f()

{

try {

use_vectors();

}

catch (Vector::Range) {

// исправить индекс и

// попробовать опять:

f();

}

catch (Vector::Size) {

cerr << "Ошибка в конструкторе Vector::Size";

exit(99);

}

// сюда мы попадем, если вообще не было особых ситуаций

// или после обработки особой ситуации Range

}

Список обработчиков напоминает переключатель, но здесь в теле обработчика операторы break не нужны. Синтаксис списка обработчиков отличен от синтаксиса вариантов case переключателя частично по этой причине, частично потому, чтобы показать, что каждый обработчик определяет свою область видимости (см. $$9.8).



Не обязательно все особые ситуации перехватывать в одной функции:

void f1()

{

try {

f2(v);

}

catch (Vector::Size) {

// ...

}

}

 

void f2(Vector& v)

{

try {

use_vectors();

}

catch (Vector::Range) {

// ...

}

}

Здесь f2() перехватит особую ситуацию Range, возникающую в use_vectors(), а особая ситуация Size будет оставлена для f1().

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

try {

// ...

}

catch (input_overflow) {

// ...

throw input_overflow();

}

Здесь input_overflow (переполнение при вводе) - имя глобального класса.

Обработчики особых ситуаций могут быть вложенными:

try {

// ...

}

catch (xxii) {

try {

// сложная реакция

}

catch (xxii) {

// ошибка в процессе сложной реакции

}

}

Однако, такая вложенность редко бывает нужна в обычных программах, и чаще всего она является свидетельством плохого стиля.



<== предыдущая лекция | следующая лекция ==>
Особые ситуации и традиционная обработка ошибок | Имена особых ситуаций


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.21 сек.