Языки программирования и структуры данных

Содержание

Слайд 2

Надежность ПС.

Показатели надежности характеризуют – способность программного средства в конкретных областях применения

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

/23

Слайд 3

Обеспечение надежности

Принципы и методы обеспечения надежности
Предупреждение ошибок
принципы и методы, позволяющие минимизировать или

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

/23

Слайд 4

Предупреждение ошибок

Лучший способ обеспечить надежность — прежде всего не допустить возникновения ошибок.

Предупреждение ошибок Лучший способ обеспечить надежность — прежде всего не допустить возникновения

Предупреждение ошибок — оптимальный путь к достижению надёжности программного обеспечения.

Методы предупреждения ошибок:
Методы, позволяющие справиться со сложностью, свести её к минимуму.
Методы достижения большей точности при разработке.
Методы улучшения обмена информацией.
Методы немедленного обнаружения и устранения ошибок.
Другие три группы методов опираются на предположение, что ошибки все-таки будут

/23

Слайд 5

Обнаружение ошибок

Если предполагать, что в программном обеспечении какие-то ошибки все же будут,

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

/23

Слайд 6

Меры по обнаружению ошибок

Взаимное недоверие.
Каждая из компонент должна предполагать, что все

Меры по обнаружению ошибок Взаимное недоверие. Каждая из компонент должна предполагать, что
другие содержат ошибки. Когда она получает какие-нибудь данные от другой компоненты или из источника вне системы, она должна предполагать, что данные могут быть неправильными, и пытаться найти в них ошибки.
Немедленное обнаружение.
Ошибки необходимо обнаружить как можно раньше. Это не только ограничивает наносимый ими ущерб, но и значительно упрощает задачу отладки.
Избыточность.
Все средства обнаружения ошибок основаны на некоторой форме избыточности (явной или неявной).

/23

Слайд 7

Исправление ошибок

После того как ошибка обнаружена, либо она сама, либо ее последствия

Исправление ошибок После того как ошибка обнаружена, либо она сама, либо ее
должны быть исправлены программным обеспечением.
Исправление ошибок самой системой — плодотворный метод проектирования надежных систем аппаратного обеспечения. Некоторые устройства способны обнаружить неисправные компоненты и перейти к использованию идентичных запасных.
Аналогичные методы неприменимы к программному обеспечению вследствие глубоких внутренних различий между сбоями аппаратуры и ошибками в программах.
Если некоторый программный модуль содержит ошибку, идентичные «запасные» модули также будут содержать ту же ошибку.

/23

Слайд 8

Исправление ошибок или предупреждение ошибок ?

Если методы ликвидации последствий сбоев не могут

Исправление ошибок или предупреждение ошибок ? Если методы ликвидации последствий сбоев не
быть обобщены для работы со многими типами искажений, лучше всего направлять силы и средства на предупреждение ошибок.
Вместо того чтобы, разрабатывая операционную систему, оснащать ее средствами обнаружения и восстановления цепочки искаженных таблиц или управляющих блоков, следовало бы лучше спроектировать систему так, чтобы только один модуль имел доступ к этой цепочке, а затем настойчиво пытаться убедиться в правильности этого модуля.

/23

Слайд 9

Устойчивость к ошибкам

Методы этой группы ставят своей целью обеспечить функционирование программной системы

Устойчивость к ошибкам Методы этой группы ставят своей целью обеспечить функционирование программной
при наличии в ней ошибок.
Они разбиваются на три подгруппы:
динамическая избыточность
методы отступления
методы изоляции ошибок.

/23

Слайд 10

Некоторые примеры

Проверка атрибутов любого элемента входных данных.
Если входные данные должны быть

Некоторые примеры Проверка атрибутов любого элемента входных данных. Если входные данные должны
числовыми или буквенными, проверьте это.
Если число на входе должно быть положительным, проверьте его значение.
Если известно, какой должна - быть длина входных данных, проверьте ее.
Проверка соответствия входных значений установленным пределам.
Если входной элемент — адрес в основной памяти, проверяйте его допустимость. Всегда проверяйте поле адреса или указателя на нуль и считайте, что оно неверно, если равно нулю. Если входные данные — таблица вероятностей, проверьте, находятся ли все значения между нулем и единицей.
Проверка допустимости всех вариантов значений.
Если входное ноле — код, обозначающий один из десяти районов, никогда не предполагайте, что если это не код ни одного из районов 1, 2, … 9, то это обязательно код района 10.

/23

Слайд 11

Обеспечение устойчивости

Самое худшее, что может сделать модуль, – это принять неправильные входные

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

/23

Слайд 12

Обработка ошибок

Функция сообщает об ошибке возращением установленного значения. Каждый раз при вызове

Обработка ошибок Функция сообщает об ошибке возращением установленного значения. Каждый раз при
этих функций происходит проверка возвращаемых значений.
if( somefunc() == ERROR_RETURN_VALUE )
//обработка ошибки или вызов обработчика ошибок
else
//нормальная работа
if( anotherfunc() == NULL )
//обработка ошибки или вызов обработчика ошибок
else
//нормальная работа
if( thirdfunc() == 0 )
//обработка ошибки или вызов обработчика ошибок
else
//нормальная работа
Проблемы:
Каждый вызов функции должен проверяться программой —
увеличение объёма кода
При использовании классов ошибки могут возникать и при неявном вызове функции, т.е. при работе конструкторов

/23

Слайд 13

Исключения

Исключения
— возникновение непредвиденных ошибочных условий
Обработка исключений
— стандартное языковое средство для

Исключения Исключения — возникновение непредвиденных ошибочных условий Обработка исключений — стандартное языковое
реакции на аномальное поведение программы во время выполнения.
Например, деление на ноль при операциях с плавающей точкой. Обычно эти условия завершают программу пользователя с системным сообщением об ошибке.
C++ даёт программисту возможность восстанавливать программу из этих условий и продолжать её выполнение.
Исключения устанавливается в блоке try, используя выражение throw.
Исключение обрабатывается вызовом соответствующего обработчика catch, который выбирается из списка обработчиков, находящегося сразу после их блока try.

/23

Слайд 14

Синтаксис исключений

try {
// код, подлежащий контролю
// функции могут генерировать исключительные ситуации
// может

Синтаксис исключений try { // код, подлежащий контролю // функции могут генерировать
содержать несколько оператор или целую программу
}
catch (тип1 аргумент) {
// перехват исключительных ситуаций
}
catch (тип2 аргумент) {
//
}

catch (типN аргумент) {
//
}
С одним блоком try может быть связано несколько операторов catch.
Из нескольких операторов выбирается оператор catch, тип аргумента которого совпадает с типом исключительной ситуации.
Аргумент может быть объектом встроенного типа или класса

/23

Слайд 15

Механизм исключений

Пусть приложение создает объекты некоторого кода и работает с ними
Если метод

Механизм исключений Пусть приложение создает объекты некоторого кода и работает с ними
обнаруживает ошибку, то он информирует приложение об этом или генерирует исключительную ситуацию
Отдельная секция кода приложения содержит операции по обработке ошибок – обработчик исключительных ситуаций, который отлавливает исключения
Код приложения, использующий объекты класса, заключается в блок повторных попыток

/23

Слайд 16

Обработка исключений

Установленное выражение — статический, временный объект, который хранится до тех пор,

Обработка исключений Установленное выражение — статический, временный объект, который хранится до тех
пока не производится выход из ветви обработки особых ситуаций. Выражение захватывается обработчиком, который может использовать его значение.
void foo()
{
int i ;
throw i;
}
main()
try {
foo();
}
catch(int n) { . . . }
Значение целого числа, выданное через throw i, хранится до завершения работы обработчика с целочисленной сигнатурой catch (int n) . Это значение доступно для использования внутри обработчика в виде аргумента.

/23

Слайд 17

Обработка исключений

vect::vect(int n)
{ if (n < 1) throw (n) ;
p = new

Обработка исключений vect::vect(int n) { if (n p = new int[n]; if
int[n];
if (p == 0) throw (”OUT OF MEMORY”);
}
void g(int m)
{ try { vect a(m); }
catch (int n)
{ cerr « "SIZE ERROR " « n « endl;}
catch (const char* error)
{ cerr « error « endl; abort();}
}

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

/23

Слайд 18

Синтаксис исключений — throw

throw исключительная ситуация;
Оператор throw генерирует указанную исключительную ситуацию. Если

Синтаксис исключений — throw throw исключительная ситуация; Оператор throw генерирует указанную исключительную
в программе есть ее перехват, оператор throw должен выполняться либо внутри блока try, либо внутри функции, явно или неявно вызываемой внутри блока try.
Исключительная ситуация может иметь любой тип, в том числе быть объектом класса, определённого пользователем
Если генерируется исключительная ситуация, для которой не предусмотрена обработка, программа может прекратить свое выполнение. В этом случае вызывается стандартная функция terminate(), которая по умолчанию вызывает функцию abort().

/23

Слайд 19

Синтаксис исключений — try

try {// код, подлежащий контролю};
Исключение может генерироваться вне блока

Синтаксис исключений — try try {// код, подлежащий контролю}; Исключение может генерироваться
try только в том случае, если оно генерируется функцией, которая содержит оператор catch и вызывается внутри блока try
Блок try может находиться внутри функции. В этом случае при каждом входе в функцию обработка исключительной ситуации выполняется заново.

/23

Слайд 20

Синтаксис исключений — catch

Код блока catch выполняется только при перехвате исключительной ситуации

Синтаксис исключений — catch Код блока catch выполняется только при перехвате исключительной

Если исключительные ситуации описываются с помощью базового и производных классов, оператор catch, соответствующий базовому классу, одновременно соответствует всем производным классам
Если необходимо обрабатывать не отдельные типы исключительных ситуаций, а перехватывать все подряд, то применяется следующий вид оператора catch:
catch (…)
{
// обработка всех исключительных ситуаций
}

/23

Слайд 21

Демонстрация исключения bad_alloc
int main()
{
const unsigned long SIZE = 10000; //объем

Демонстрация исключения bad_alloc int main() { const unsigned long SIZE = 10000;
памяти
char* ptr; //указатель на адрес в памяти
try
{
ptr = new char[SIZE]; //разместить в памяти SIZE байт
}
catch(bad_alloc) //обработчик исключений
{
cout << "\n Исключение bad_alloc:”;
cout << "\n невозможно разместить данные в памяти.\n";
return(1);
}
delete[] ptr; //освободить память
cout << "\n Память используется без сбоев. \n";
return 0;
}

/23

Слайд 22

Умный указатель

Будем использовать объект, хранящий указатель и освобождающий объект в своём деструкторе.
Домашнее

Умный указатель Будем использовать объект, хранящий указатель и освобождающий объект в своём
задание: для класса «Умный указатель» добавить в определение класса обработку исключений.

template
class auto_ptr {
public:
auto_ptr(T *p = 0) {};
~auto_ptr() { delete ptr; }
private:
T *ptr;
};

/23

Имя файла: Языки-программирования-и-структуры-данных.pptx
Количество просмотров: 39
Количество скачиваний: 0