Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_Ekzamen.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.04 Mб
Скачать
  1. Несподівані виключення та їх обробка.

Все неожиданные исключения обрабатываются одним и тем же единственным обработчиком unexpected.

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

В отличие от нормальных обработчиков исключений, таких как

catch (int)

{

}

Обработчик unexpected не «перехватывает» исключение. Начав выполняться, обработчик знает только то, что произошло некоторое неожиданное исключение. Обработчик игнорирует тип исключения и место его происхождения и даже не может обратиться к библиотеке за помощью: никакая из функций библиотеки и никакой объект библиотеки не сохраняет информацию об исключении. В лучшем случае обработчик unexpected может перебросить управление другому участнику, который может дать больше ответов. Рассмотрим код

#include <exception>

using namespace std;

void my_unexpected_handler()

{

throw 1;

}

void f() throw(int)

{ throw 1L; // ой! -- *плохая* функция

}

int main()

{

set_unexpected(my_unexpected_handler);

try

{

f();

}

catch (...)

{

}

return 0;

}

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

В этом примере исключение типа int в обработчике my_unexpected_handler полностью соответствует нарушенной спецификации и main успешно перехватит его.

  1. Виключення в конструкторах та деструкторах.

  1. Ієрархія виключень.

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

Класс Exception является базовым классом для исключений. Несколько классов исключений наследуются непосредственно от Exception, в том числеApplicationException и SystemException. Эти два класса образуют основу почти для всех исключений среды выполнения.

Большинство исключений, полученных непосредственно из Exception, не добавляют функциональность к классу Exception. Например, иерархия класса InvalidCastException следующая:

Object    Исключение       SystemException          InvalidCastException

Среда выполнения создает соответствующий производный класс SystemException при возникновении исключения. Эти ошибки возникают в результате сбоев при проверках, выполняемых средой выполнения (таких как ошибки выхода массива за границы диапазона), и могут возникать при выполнении любого метода. При разработке приложения, порождающего новые исключения, такие исключения следует создавать из класса Exception. Не рекомендуется перехватывать исключение SystemException или создавать исключение SystemException в пользовательских приложениях.

Наиболее серьезные исключения (создаются средой выполнения или в результате неустранимых условий) включают в себя ExecutionEngineException,StackOverflowException и OutOfMemoryException.

Исключения взаимодействия являются производными от SystemException и расширяются классом ExternalException. Например, COMException — это исключение, порождаемое в ходе операций COM-взаимодействия, производное от ExternalException. Классы Win32Exception и SEHException также являются наследниками ExternalException.

Иерархия исключений среды выполнения

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

Тип исключения

Базовый тип

Описание

Пример

Исключение

Объект

Базовый класс для всех исключений.

Отсутствует (используйте класс, производный от этого исключения).

SystemException

Исключение

Базовый класс для всех ошибок, созданных средой выполнения.

Отсутствует (используйте класс, производный от этого исключения).

IndexOutOfRangeException

SystemException

Генерируется средой выполнения только при неправильной индексации массива.

Индексирование массива вне его действительного диапазона:

arr[arr.Length+1]

NullReferenceException

SystemException

Создается средой выполнения только при ссылке на пустой объект.

object o = null;

o.ToString();

AccessViolationException

SystemException

Создается средой выполнения только при доступе к недопустимому участку памяти.

Возникает при взаимодействии с неуправляемым кодом или с небезопасным управляемым кодом, а также при использовании неправильного указателя.

InvalidOperationException

SystemException

Генерируется методами в случае недопустимого состояния.

Вызов Enumerator.GetNext() после удаления Item из соответствующей коллекции.

ArgumentException

SystemException

Базовый класс для всех исключений аргументов.

Отсутствует (используйте класс, производный от этого исключения).

ArgumentNullException

ArgumentException

Генерируется методами, для которых не допускается пустое значение аргументов.

String s = null;

"Calculate".IndexOf (s);

ArgumentOutOfRangeException

ArgumentException

Генерируется методами, проверяющими принадлежность аргументов к заданному диапазону.

String s = "string";

s.Chars[9];

ExternalException

SystemException

Базовый класс для исключений, происходящих или предназначенных для сред вне среды выполнения.

Отсутствует (используйте класс, производный от этого исключения).

ComException

ExternalException

Исключение, инкапсулирующее сведения HRESULT COM.

Используется при взаимодействии COM.

SEHException

ExternalException

Исключение, инкапсулирующее структурированные данные обработки исключений Win32.

Используется в операциях с неуправляемым кодом.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]