Программирование >>  Разработка устойчивых систем 

1 ... 4 5 6 [ 7 ] 8 9 10 ... 196


Блоки try уровня функций

Исключения при выполнении конструкторов происходят достаточно часто. Допустим, вы хотите обработать исключения, происходящие при инициализации вложенных объектов или подобъектов базовых классов. Для этого инициализация таких подобъектов заключается в блок tiy уровня функции. В отличие от обычного синтаксиса, блоком try для инициализаторов конструкторов является само тело конструктора, а блок catch следует за телом конструктора, как в следующем примере.

: C0l:In1tExcept.cpp {-Ьог}

Обработка исключений в подобъектах

#include <iostream>

using namespace std;

class Base {

int i; public:

class BaseExcept {}:

Base(int i) : i(i) { throw BaseExceptO: }

class Derived : public Base { public:

class DerivedExcept { const char* msg:

public:

DerivedExcept(const char* msg) : msg(msg) {} const char* whatO const { return msg: }

Derived(int j) try

: Base(j) {

Тело конструктора

cout This wont print endl;

catch (BaseExceptS) { throw DerivedExcept( Base subobject threw );;

int mainO { try { Derived d(3):

catch (Derived::DerivedExceptS d) { cout d.whatO endl; Base subobject threw

} III:-

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



Стандартные исключения

Исключения стандартной библиотеки С++ также могут использоваться в ваших программах. Как правило, проще и удобнее начать со стандартного luiacca ис1С71юче-ния, чем пытаться определять собственный ic/iacc. Даже если стандартный ic/iacc делает не совсем то, что нужно, на его основе всегда можно создать производный ic/iacc.

Все стандартные классы исключений в конечном счете являются производными от общего предка exception, определенного в заголовке <exception>. Два основных производных класса logic error и runtime error определяются в заголовке <stdexcept> (который включает <exception>). Класс logic error представляет ошибки в логике программирования - например, передачу недопустимых аргументов. К категории runtime error относятся те ошибки, которые возникают в результате непредвиденных обстоятельств (скажем, сбоев оборудования или нехватки памяти). В обоих классах, runtime error и logic error, определен конструктор с аргументом std::string. Он позволяет сохранить сообщение в объекте исключения и извлечь его позднее с помощью функции exception::what(), как это сделано в следующем примере:

: C01:StdExcept.cpp

Создание класса исключения, производного от std::runtime error #include <stdexcept> #include <iostream> using namespace std:

class MyError : public runtime error { public:

MyError(const strings msg = ) : runtime error(msg) {}

int mainO { try {

throw MyError( my message ):

Как показывает следующий пример, в С++ также допускается создание блоков try уровня функции для л7обых функций (впрочем, особенно полезной эту возможность не назовешь):

: C01:FunctionTryBlock.cpp {-bor}

Блоки try уровня функций

{RunByHand} (Не запускать автоматически)

#include <1ostream>

using namespace std:

int mainO try {

throw main : } catch(const char* msg) {

cout msg endl:

return 1: } /:-

В этом случае блок catch возвращает управление по аналогии с тем, как оно обычно возвращается из тела функции. Данная разновидность блоков try уровня функции практически не отличается от простого заключения кода функции в конструкцию try/catch.



catch (МуЕггог& х) { cout X.what О endl;

} III-

Хотя конструктор runtime error сохраняет сообщение в подобъекте std::excepti*on, класс std::except!on не содержит конструктора с аргументом std::string. Обычно классы исключений объявляются производными не от std::exception, а от runtime error или logic error (или одного из их потомков).

Ниже кратко описаны основные классы исключений.

exception

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

logic error

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

runtime error

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

Класс исключений потоков ввода-вывода ios::failure тоже является производным от exception, но других подклассов не имеет.

Следующие luiaccbi (производные от logic error и от runtime error) можно использовать как есть или же создать на их основе производные классы для более специализированных типов исключений.

Далее перечислены классы исключений, производные от logic error.

domain error

Сообщает о нарушении предусловия.

invalid argument

Указывает, что функции, запустившей исключение, был передан недопустимый аргумент.

length error

Сообщает о попытке создания объекта, размер которого больше или равен npos (размер наибольшего представимого значения контекстного типа, обычно std::size t).

out of range

Сообщает о выходе аргумента из интервала допустимых значений.

bad cast

Выдается при выполнении недопустимых выражений dynamic cast в подсистеме RTTI (см. главу 8).

bad typeid

Сообщает об использовании null-указателя р в выражении typeid(*p). Также используется подсистемой RTTI (см. главу 8).



1 ... 4 5 6 [ 7 ] 8 9 10 ... 196

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