Виды исключительных ситуаций
Процедурное
Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, то есть значений исходных данных, в заключительное, то есть в результаты. Таким образом, с точки зрения программиста имеются программа и память, причем первая последовательно обновляет содержимое последней.
Модульность - принцип, согласно которому программное средство разделяется на отдельные именованные сущности, называемые модулями. Модульность часто является средством упрощения задачи проектирования ПС и распределения процесса разработки ПС между группами разработчиков. При разбиении ПС на модули для каждого модуля указывается реализуемая им функциональность, а также связи с другими модулями.
Парадигма программирования, в которой основнымиконцепциями являются понятия объектов и классов. В случае языков с прототипированием вместо классов используются объекты-прототипы. Данные объекта скрыты от остальной программы - инкапсуляция. Объекты с одинаковыми интерфейсами могут иметь различную реализацию – полиморфизм. Наследование – свойство объекта которое позволяет объектам иметь некоторую реализацию но при этом обладать различными интерфейсами.
В процедурном программировании минимальная неделимая единица – функция. Программа = последовательность функций. Функция характеризуется входными и выходными параметрами.
В Модульном программировании минимальная единица – модуль. Модуль содержит данные либо процедуры. Программа – набор правил взаимодействия модулей.
В ООП минимальная единица – объект.объект содержит данные и методы. Программа – процесс взаимодействия объектов между собой. Классы содержат методы и атрибуты.
4.Отношения между классами: ассоциация, агрегация, композиция, использование, наследование.
Ассоциация – взаимодействие объектов некоторых классов между собой.
Существуют следующие виды: однонаправленная, двунаправленная, агрегация, композиция и наследование.
Использование – однонаправленная ассоциация. Объекты являются структурно независимыми, но один из них может вызывать методы другого.
При двунаправленной ассоциации происходит взаимное использование.
Агрегация – отношение «часть-целое» между двумя равноправными объектами. Оба объекта могут существовать независимо: если контейнер будет уничтожен, то его содержимое — нет
Композиция— более строгий вариант агрегирования, когда включаемый объект может существовать только как часть контейнера. Если контейнер будет уничтожен, то и включённый объект тоже будет уничтожен.
Наследование – такой тип ассоциации объекта, который указывает на то, что один объект является частной формой другого другого. Пример наследования: пес -> животное
5.Необязательные принципы ООП: типизация, параллелизм, сохраняемость.
Типизация - это ограничение, накладываемое на свойства объектов и препятствующее взаимозаменяемости абстракций различных типов. Нельзя складывать собаку с помидором.
Тип может связываться с программным объектом статически и динамически. Реализация позднего связывания в языке программирования позволяет создавать переменные - указатели на объекты, принадлежащие различным классам
Параллелизм - свойство нескольких абстракций одновременно находиться в активном состоянии, т.е. выполнять некоторые операции. Существует целый ряд задач, решение которых требует наличия одновременного выполнения некоторых последовательностей действий. Системы с одним процессором имитируют параллелизм за счет разделения времени процессора между задачами управления различными процессами. (мультиплексирование)
Сохраняемость – способность объекта существовать во времени, переживая породивший его процесс, и (или) в пространстве, перемещаясь из своего первоначального адресного пространства. Состояние объекта можно сохранить в каком-нибудь виде. (JSON,XML)
6.Отношения между объектами: взаимодействие клиент-сервер.
Рассмотрим два объекта, А и В, между которыми имеется связь.
Как участник связи объект может играть одну из трех ролей:
Клиент — объект, который может воздействовать на другие объекты, но никогда не подвержен воздействию других объектов;
Сервер — объект, который никогда не воздействует на другие объекты, он только используется другими объектами;
Агент — объект, который может как воздействовать на другие объекты, так и использоваться ими. Агент создается для выполнения работы от имени актера или другого агента.
Для того чтобы объект А мог послать сообщение в объект В, надо, чтобы В был виден для А.
есть следующие четыре способа обеспечить видимость.
1. Сервер является глобальным относительно клиента;
2. Сервер (или указание на него) передан клиенту как параметр операции;
3. Сервер является частью клиента.
4. Сервер локально порождается клиентом в ходе выполнения какой-либо операции.
7.Отношения между объектами: иерархии объектов.
Для любого объекта можно определить наследников, корректирующих или дополняющих его поведение. При этом нет необходимости иметь доступ к исходному коду родительского объекта и повторять его в потомках. Наследование позволяет создавать иерархии объектов.
Иерархия представляется в виде дерева, в котором более общие объекты располагаются ближе к корню, а более специализированные — на ветвях и листьях.любой объект может иметь одного предка и произвольное количество потомков. В некоторых языках объекты могут иметь несколько предков. В таком случае возникают логические парадоксы “diamondproblem”
Объекты могут иметь сложные связи. В зависимости от контекста один и тот же объект может быть клиентом, агентом или сервером.
При организации взаимодействий между объектами следует выбирать наиболее общего предка.
При проектировании объектов следует соблюдать принцип подстановки Лисков. Принцип гласит, что методы, которые используют базовый тип, должны иметь возможность использовать подтипы базового типа не зная об этом.
Любой тип может быть заменен в программе типом наследником.
Принцип открытости/закрытости устанавливает следующее положение: «программные сущности (классы, модули, функции и т. п.) должны быть открыты для расширения, но закрыты для изменения»
8.Базовые принципы ООП: инкапсуляция, наследование, полиморфизм. Примеры применения.
Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними в классе, и скрыть детали реализации от пользователя.
class A
{
public:
int a, b; //данные открытого интерфейса
intReturnSomething(); //метод открытого интерфейса
private:
intAa, Ab; //скрытыеданные
voidDoSomething(); //скрытыйметод
};
Наследование — это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником или производным классом.
class A{ //базовый класс
};
class B : A{ // наследование
};
Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
abstract class Animal {
String talk();
}
class Cat extends Animal {
String talk() { return "Meow!"; }
}
class Dog extends Animal {
Stringtalk() { return "Woof!"; }
}
9.Понятие класса, понятие объекта. Понятие членов экземпляра класса и члена класса.
Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности (объекта). Фактически он описывает устройство объекта, являясь своего рода чертежом. Говорят, что объект — это экземпляр класса.
Сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса или копирования прототипа
Класс можно представить в виде объекта.
Членами класса являются методы и поля. Поля содержат данные и описывают состояние. Поля могут принадлежать как классу так и экземпляру класса.
Методы описывают поведение класса или объекта.
Как и поля, код в виде методов/функций/процедур, принадлежащих классу, может быть отнесен либо к самому классу, либо к экземплярам класса. Метод, принадлежащий классу и соотнесенный с классом (статический метод) может быть вызван сам по себе и имеет доступ к статическим переменным класса.
Метод, соотнесенный с экземпляром класса (обычный метод), может быть вызван только у самого объекта, и имеет доступ как к статическим полям класса, так и к обычным полям конкретного объекта (при вызове этот объект передастся скрытым параметром метода).
Члены экземпляра находятся в области видимости экземпляра. Члены класса – в классе и экземплярах.
Класс всегда один. Экземпляров может быть много.
10.Классификация методов объекта в ООП.
В ооп методы объекта можно классифицировать по: форме доступа, возможности переопределения, принадлежности к классу или объекту
- закрытые – доступны только методам текущего класса
- защищенные – доступны в текущем классе и классах наследниках
- открытые – доступны всем
- абстрактные – не имеют реализации и должны быть объявлены в классах наследниках
- виртуальные - имеют реализацию, но могут быть переопределены в классах наследниках
- конкретные/финальные – имеют реализацию и не могут быть изменены в классах наследниках
- статические – принадлежат классу
- динамические – принадлежат экземпляру
- также бывают внешние – находящиеся в подключаемых модулях. Похожи на абстрактные, но реализация метода отдельна от сигнатуры.
- Встраиваемые – при компиляции в текст программы вставляется код метода, реальный вызов не происходит
11. Идентичность и жизненный цикл объекта.
Идентичность - это такое свойство объекта, которое отличаетего от всех других объектов. В большинстве языков программирования иуправления БДвременные объекты именуют, чтобы различать их, тем самым путая адресуемость и идентичность. Источникоммножества ошибок в ООП является неумение отличать имя объекта от самого объекта.
Идентичность (уникальность) объекта является очень важной егохарактеристикой. Практически всегда объекты можно различить хотябы потому, что они занимают отдельное место в памяти ЭВМ. При этоммы имеем дело с уникальностью, основанной на адресуемости. Разные языки могут предоставлять различные средства для поддержки идентичности объектов. Например, в C++ можно приниматьрешение об идентичности как на основе конкретного адреса размещения объекта, так и на основе результата определяемого пользователемоператора operator==. Жизненный цикл объекта.С точки зрения программы объект рождается тогда, когда под него выделяется память и происходит инициализация его состояния. Объект заканчивает свой жизненный путь тогда, когда высвобождаются занятые им ресурсы, и память возвращается в систему для дальнейшего использования. В разных ОО языках существуют разные механизмы, управляющие рождением и уничтожением объектов. Примером для C++ могут служить конструкторы и деструкторы, операторы new и delete.
12. Управление доступом к компонентам класса. Применение атрибутов доступа к классам, свойствам и методам классов.
- Private. Все, что объявлено в секции private недоступно за пределами модуля. Секцияprivate позволяет скрыть те поля и методы, которые относятся к так называемымособенностям реализации.
- Public. Поля, методы и свойства, объявленные в секции public не имеют никакихограничений на использование, т.е. всегда видны за пределами модуля. Все, чтопомещается в секцию public, служит для манипуляций с объектами и составляет программный интерфейс класса.
- Protected. Поля, методы и свойства, объявленные в секции protected, видны запределами модуля только потомкам данного класса; остальным частям программыони не видны. Так же как и private, директива protected позволяет скрыть особенности реализации класса, но в отличие от нее, разрешает другим программистам порождать новые классы и обращаться к полям, методам и свойствам, которые составляют так называемый интерфейс разработчика. В эту секцию обычно помещаются виртуальные методы.
13. Одиночное и множественное наследование классов и интерфейсов, примеры использования.
Наследование представляет собой способность производного класса наследовать характеристики существующего базового класса.
Одиночное наследование. Класс, от которого произошло наследование, называется базовым или родительским. Классы, которые произошли от базового, называются потомками, наследниками или производными классами.
Пример:
class Animal { }
class Cat extends Animal { }
classDogextendsAnimal { }
При множественном наследовании у класса может быть более одного предка. множественное наследование позволяет с большим простором строить иерархии классов, но с другой есть ряд опасных моментов - проблема в совпадающих именах методов - грубейшая упущение, которое происходит еще на этапе проектирования..
class A {
public:
voiddoSmth() { }
};
class B {
public:
voiddoSmth() { }
};
class C: public A, public B { };
При вызове C::doSmth() появится неопределенное поведение, т.к. не понятно, какой экземпляр метода вызвать: из класса A или класса B. Решение – явно указать конкретную реализацию метода: Csome; some.B::doSmth();
В контексте C++ интерфейс это класс, в котором объявлены, но не реализованы методы. Реализовываться они будут в дочерних по отношению к данному классах, то есть полностью абстрактный класс. Интерфейс реализуется как обычный класс.
classILoad {
public:
virtualvoidStartLoading()=0;
virtualboolIsFinish()=0;
};
classCImg : public ILoad {
public:
virtual void StartLoading()
{printf("Img ->StartLoading");}
virtualboolIsFinish()
{ return true;}
};
14. Управление доступом к компонентам класса при наследовании.
В C++ существует три типа наследования: public, protected, private. Спецификаторы доступа членов базового класса меняются в потомках следующим образом:
Если класс объявлен как базовый для другого класса со спецификатором доступа public, тогда public члены базового класса доступны как public члены производного класса, protected члены базового класса доступны как protected члены производного класса.
Если класс объявлен как базовый для другого класса со спецификатором доступа protected, тогда public и protected члены базового класса доступны как protected члены производного класса.
Если класс объявлен как базовый для другого класса со спецификатором доступа private, тогда public и protected члены базового класса доступны как private члены производного класса.
15. Приведение типов при наследовании.
В стандарте C++ предусмотрено несколько шаблонных функций для преобразования типов.
const_cast<> - предназначен для снятия модификаторов const и volatile. Александреску написал интересную статью о использовании volatile и const_cast для многопоточного программирования.
dynamic_cast<> - преобразовывает указатель на базовый тип к указателю на тип наследник, если объект действительно наследник, или вернет NULL в противном случае. Припреобразованиииспользуется RTTI (run-time type identification).
class Base {
public: virtual ~Base();
} * pBase;
class Derived : Base{};
Derived *pDerived = dynamic_cast(pBase);
Такоепреобразованиепочтиэквивалентно:
if (typeid(Derived) == typeid(*pBase)) {
pDerived = (Derived*)pBase;
}
Почти, потому что в таком случае возможны накладки, так при виртуальном наследовании прямая интерпретация указателя, как указателя на наследника ( (Derived*)pBase ) дает ошибку, кроме того dynamic_castв теории можно использовать, если Derived не полностью определен в поле видимости преобразования. Однако на практике VS этим преимуществом воспользоваться не дает. Кроме того typeid выдает точный тип объекта, а не возможность преобразования одного в другой. Так с помощью typeid не будет работать следующий вариант:
class A {...};
class B : public A {...};
class C : public B {...};
A *c = new C;
if (typeid(B) == typeid(*c)) {...}
Так же с помощью dynamic_cast можно преобразовывать и ссылочные типы. Следует также оговорится, что базовый класс обязан иметь виртуальные функции, хотя бы деструктор, иначе объект не будет полиморфным.
А каким преобразованием нужно воспользоваться, чтоб привести указатель на наследника к указателю на базовый класс?
Ответ: никаким, это законная операция:
1.Derived *pDerived = new Derived();
2.Base *pBase = pDerived;
Но при этом нельзя преобразовывать, если наследование было закрытым.
static_cast<> - шаблонная функция, для статического (т.е. на этапе компиляции) преобразования типов. Функция позволяет преобразовывать не все типы. А только те, для которых есть стандартное преобразование или преобразование определенное пользователем. Он также как и dynamic_castпозволяет преобразовывать B* из A*, если B наследник A, однако не контролирует правильность результата. Если B и A не связаны отношениями наследования, то преобразование не удастся.
static_cast<> сохраняет модификаторы const и volatile, а так же требует полного объявления классов.
reinterpret_cast<> - преобразование методом грубой силы, вероятно именно его имеют в виду в инструкциях, когда пишут о необходимости доработать деталь напильником. Что в результате этого преобразования получится и как оно будет работать заранее предугадать сложно. Эта шаблонная функция позволяет char* преобразовать в int, A* в B*, не требуя каких-то родственных отношений между ними.reinterpret_cast не осуществляет навигацию по иерархии классов, поэтому в не обязано работать то, что работало бы с static_cast.
У reinterpret_cast есть одно небольшое преимущество, он не требует полного определения типов, когда преобразовывает указатели или ссылки на них.
16. Полиморфизм и понятие виртуальных методов.
Полиморфизм – возможность создания множественных определений для операций и функций. Какое из определений будет использовано, зависит от контекста программного кода. Говорят так: «один интерфейс - множество реализаций» Т.е. полиморфизмом называют в общем случае правило с одним именем, которое может принимать одну из множественной совокупности форм. Он повышает степень абстрагирования при создании программных продуктов т.к. в этом случае задача программиста указать правильное действие а не то как его выполнить. Реализуется полиморфизм в языке С++ через механизм перегрузки функций, механизм виртуальных функций, а также через механизм перегрузки операций языка.
Виртуальный метод (виртуальная функция) — в объектно-ориентированном программировании метод (функция) класса, который может быть переопределён в классах-наследниках так, что конкретная реализация метода для вызова будет определяться во время исполнения. Таким образом, необязательно знать точный тип объекта для работы с ним через виртуальные методы: достаточно лишь знать, что объект принадлежит классу или наследнику класса, в котором метод объявлен.
Виртуальные методы — один из важнейших приёмов реализации полиморфизма. Они позволяют создавать общий код, который может работать как с объектами базового класса, так и с объектами любого его класса-наследника. При этом базовый класс определяет способ работы с объектами и любые его наследники могут предоставлять конкретную реализацию этого способа. В некоторых языках программирования, например в Java, нет понятия виртуального метода, данное понятие следует применять лишь для языков, в которых методы родительского класса не могут быть переопределены по умолчанию, а только с помощью некоторых вспомогательных ключевых слов. В некоторых же (как, например, в Python), все методы — виртуальные.
Базовый класс может и не предоставлять реализации виртуального метода, а только декларировать его существование. Такие методы без реализации называются «чистыми виртуальными» (перевод англ. purevirtual) или абстрактными. Класс, содержащий хотя бы один такой метод, тоже будет абстрактным. Объект такого класса создать нельзя (в некоторых языках допускается, но вызов абстрактного метода приведёт к ошибке). Наследники абстрактного класса должны предоставить реализацию для всех его абстрактных методов, иначе они, в свою очередь, будут абстрактными классами.
Для каждого класса, имеющего хотя бы один виртуальный метод, создаётся таблица виртуальных методов. Каждый объект хранит указатель на таблицу своего класса. Для вызова виртуального метода используется такой механизм: из объекта берётся указатель на соответствующую таблицу виртуальных методов, а из неё, по фиксированному смещению, — указатель на реализацию метода, используемого для данного класса. При использовании множественного наследования или интерфейсов ситуация несколько усложняется за счёт того, что таблица виртуальных методов становится нелинейной.
17. Создание и уничтожение объектов. Конструкторы и деструкторы.
Конструкторы и деструкторы особые члены класса, служащие для инициализации и уничтожения объекта. Ниже приведены некоторые их особенности:
•они не возвращают никакого значения даже void;
•не участвуют в механизме наследования;
•нельзя получить их адрес;
•конструкторы не могут быть виртуальными;
•деструктор не имеет аргументов, а значит его нельзя перегружать;
•автоматически вызываются при создании и уничтожении объекта.
Конструкторы имеют тоже имя, что и имя класса. Конструктор принимающий ссылку на собственный класс, называется конструктором копирования. Конструктор без аргументов называется пустым конструктором. Если в классе конструкторы явно не определены, то создается пустой конструктор по умолчанию. Также если пустой конструктор определен, то он используется для инициализации объекта по умолчанию.
Деструктор имеет тоже имя, что и имя класса, но перед именем ставится знак ~. При инициализации объекта, вначале инициализируются его родительские объекты в порядке включения.
18. Переопределение методов, влияние атрибутов доступа при переопределении методов.
Переопределение метода в ООП - одна из возможностей ЯП, позволяющая подклассу или дочернему классу обеспечивать специфическую реализацию метода, уже реализованного в одном из суперклассов или родительских классов. Реализация метода в подклассе переопределяет (заменяет) его реализацию в суперклассе, описывая метод с тем же названием, что и у метода суперкласса, а также у нового метода подкласса должны быть те же параметры или сигнатура, тип возвращаемого результата, что и у метода родительского класса. Версия метода, которая будет исполнятся, определяется объектом, используемым для его вызова. Если вызов метода происходит от объекта родительского класса, то выполняется версия метода родительского класса, если же объект подкласса вызывает метод, то выполняется версия дочернего класса. Некоторые ЯП позволяют программисту защищать методы от переопределения. При переопределении методов их модификаторы доступа должны совпадать. Так, нельзя переопределить метод, имеющий модификатор доступа public, методом с модификатором доступа private. Абстрактный метод указывается модификатором abstract. Такой метод никогда не имеет тела метода: вместо фигурных скобок, ограничивающих тело метода, объявление метода завершается точкой с запятой. Абстрактные методы можно объявлять только в абстрактных классах или интерфейсах. Объявление абстрактного метода в классе, не имеющем модификатора abstract, приводит к ошибке компиляции. Любой подкласс абстрактного класса, который сам не является абстрактным классом, должен определять реализацию всех наследуемых не реализованных абстрактных методов. Методы, объявленные с модификатором private, не могут быть абстрактными методами, так как они недоступны вне тела класса. Статические методы также не могут выступать в качестве абстрактных методов, так как считаются конечными и не могут быть переопределены. Объявление метода с модификатором final запрещает его последующее переопределение. Такие методы называются конечными методами, и по умолчанию считается, что private-метод всегда является конечным методом. Методы, объявленные с модификатором native, могут иметь реализацию на другом языке программирования.
19. Понятие абстрактных классов и методов.
Абстрактный класс в объектно-ориентированном программировании — базо-вый класс, который не предполагает создания экземпляров. Абстрактные классы реализуют на практике один из принципов ООП - полиморфизм. Абстрактный класс может содержать (и не содержать) абстрактные методы и свойства. Абстрактный метод не реализуется для класса, в котором описан, однако должен быть реализован для его неаб-страктных потомков. Абстрактные классы представляют собой наибо-лее общие абстракции, то есть имеющие наибольший объем и наименьшее содержание.
В одних языках создавать экземпляры аб-страктных классов запрещено, в других это допускается (например, Delphi), но обращение к абстрактному методу объекта этого класса в процессе выполнения программы приведёт к ошибке. Во многих языках допустимо объявить любой класс абстрактным, даже если в нём нет абстрактных методов (например, Java), именно для запрещения создания экземпляров. Абстрактный класс можно рассматривать в качестве интерфейса к семейству классов, порождённому им, но, в отличие от классического интерфейса, абстрактный класс может иметь определённые методы, а также свойства.
Абстрактные методы часто являются и виртуальными, в связи с чем понятия «аб-страктный» и «виртуальный» иногда путают.
20. Использование абстракции при наследовании.
В некоторых языках используются абстрактные классы. Абстрактный класс — это класс, содержащий хотя бы один абстрактный метод, он описан в программе, имеет поля, методы и не может использоваться для непосредственного создания объекта. То есть от абстрактного класса можно только наследовать. Объекты создаются только на основе производных классов, наследованных от абстрактного. Например, абстрактным классом может быть базовый класс «сотрудник вуза», от которого наследуются классы «аспирант», «профессор» и т. д. Так как производные классы имеют общие поля и функции (например, поле «год рождения»), то эти члены класса могут быть описаны в базовом классе. В программе создаются объекты на основе классов «аспирант», «профессор», но нет смысла создавать объект на основе класса «сотрудник вуза».
21. Статические поля и методы классов.
У класса могут быть поля, связанные не с объектами, а с самим классом. Эти поля объявляются как статические с модификатором static. Статические поля доступны всем методам класса. Независимо от того, какой объект вызвал метод, используются одни и те же статические поля, позволяя методу использовать информацию, созданную другими объектами класса. Статические поля представляют общий информационный пул для всех объектов классов, позволяя извлекать и создавать общую информацию. Например, у класса Person может быть статическое поле message, в котором каждый объект может оставить сообщение для других объектов класса.
Аналогично полям, у класса могут быть и статические методы, объявленные с модификатором static. Статические методы— это функции, используемые в контексте класса. Они сами не могут получать доступ ни к каким обычным свойствам класса, потому что такие свойства принадлежат объектам. Однако из статических методов можно обращаться к статическим свойствам. И если вы измените статическое свойство, то все экземпляры этого класса смогут получать доступ к новому значению.
Такие методы не используют информацию о свойствах конкретных объектов класса - они обрабатывают общую для класса информацию, хранящуюся в его статических полях. Например, в классе Person может быть статический метод, обрабатывающий данные из статического поля message. Другим частым случаем применения статических методов является ситуация, когда класс предоставляет свои сервисы объектам других классов.
Инициализация статических переменных выполняется при загрузке класса. Инициализация переменных выполняется в порядке их следования в объявлении класса.
Например:
public class C {
public C() { }
staticint b=3;
staticint c;
static{ b++; c = 10; }// Инициализация статической переменной
}
Поскольку доступ к статическому элементу осуществляется через класс, а не экземпляр объекта, не нужна переменная, которая ссылается на объект. Вместо этого используется имя класса, после которого вС++ указывается два двоеточия «::»
22. Понятие исключительной ситуации. Классификация исключений.
Обрабо́ткаисключи́тельныхситуа́ций (англ. exceptionhandling) — механизм языков программирования, предназначенный для описания реакции программы на ошибки времени выполнения и другие возможные проблемы (исключения), которые могут возникнуть при выполнении программы и приводят к невозможности (бессмысленности) дальнейшей отработки программой её базового алгоритма. В русском языке также применяется более короткая форма термина: «обработка исключений».
Общее понятие исключительной ситуации
Во время выполнения программы могут возникать ситуации, когда состояние данных, устройств ввода-вывода или компьютерной системы в целом делает дальнейшие вычисления в соответствии с базовым алгоритмом невозможными или бессмысленными. Классические примеры подобных ситуаций приведены ниже.
•Целочисленное деление на ноль. Результата у операции быть не может, поэтому ни дальнейшие вычисления, ни попытка использования результата деления не приведут к решению задачи.
• Ошибка при попытке считать данные с внешнего устройства. Если данные не удаётся ввести, любые дальнейшие запланированные операции с ними бессмысленны.
•Исчерпание доступной памяти. Если в какой-то момент система оказывается не в состоянии выделить достаточный для прикладной программы объём оперативной памяти, программа не сможет работать нормально.
• Появление сигнала аварийного отключения электропитания системы. Прикладную задачу, по всей видимости, решить не удастся, в лучшем случае (при наличии какого-то резерва питания) прикладная программа может позаботиться о сохранении данных.
• Появление на входе коммуникационного канала данных, требующих немедленного считывания. Чем бы ни занималась в этот момент программа, она должна перейти к чтению данных, чтобы не потерять поступившую информацию.
Виды исключительных ситуаций
Исключительные ситуации, возникающие при работе программы, можно разделить на два основных типа: синхронные и асинхронные, принципы реакции на которые существенно различаются.
• Синхронные исключения могут возникнуть только в определённых, заранее известных точках программы. Так, ошибка чтения файла или коммуникационного канала, нехватка памяти — типичные синхронные исключения, так как возникают они только в операции чтения из файла или из канала или в операции выделения памяти соответственно.
• Асинхронные исключения могут возникать в любой момент времени и не зависят от того, какую конкретно инструкцию программы выполняет система. Типичные примеры таких исключений: аварийный отказ питания или поступление новых данных.
23.Способы обработки ошибок. Выбрасывание и перехват исключений. Разработка кода, безопасного к возникновению исключений.
Способыобработкиошибок
· Возвращениенейтральногозначение.
· Замена на следующий подходящий блок данных.
· Возвращениепредыдущегорезультата.
· Выбор ближайшегодопустимогозначения.
· Записьлогов в файл.
· Возвращениекодаошибки.
· Вызовобработчикаошибок.
· Вывод сообщения об ошибке вне зависимости от места её появления.
· Обработка ошибки в месте её возникновения.
· Прекращениевыполнения.