Стефан Дэвис - С++ для чайников .

Здесь есть возможность читать онлайн «Стефан Дэвис - С++ для чайников .» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2007, ISBN: 2007, Издательство: Издательский дом Вильямс. Компьютерное издательство Диалектика, Жанр: Технические науки, Программирование, Программы, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

С++ для чайников .: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «С++ для чайников .»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

empty-line
1
empty-line
4

С++ для чайников . — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «С++ для чайников .», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

►Так что же мы будем бросать?...295

За ключевым словом throw следует выражение, которое создаёт объект некоторого типа. В приведённых здесь примерах мы генерировали переменные типа int , но на самом деле ключевое слово throw работает с любым типом объекта. Это значит, что вы можете "бросать" любое количество информации. Рассмотрим приведённое ниже определение класса.

//

/* CustomExceptionClass — демонстрация исключений */

/* при использовании факториала */

#include

#include

#include

#include

using namespace std ;

/* Exception — обобщённый класс исключения */

class Exception

{

public :

Exception( char* pMsg , int n , char* pFile , int nLine )

: msg( pMsg ) , errorValue( n ) , file( pFile ) , lineNum( nLine )

{ }

virtual string display( )

{

ostringstream out ;

out << "Ошибка <" << msg

<< " - значение равно " << errorValue

<< ">\n" ;

out << "@" << file << "-" << lineNum << endl ;

return out.str( ) ;

}

protected :

/* Сообщение об ошибке */

string msg ;

int errorValue ;

/* Имя файла и номер строки, где произошла ошибка */

string file ;

_________________

295 стр. Глава 25. Обработка ошибок и исключения

int lineNum ;

} ;

/* factorial — вычисление факториала */

int factorial( int n )

{

/* Функция не обрабатывает отрицательные значения аргумента */

if ( n < 0 )

{

throw Exception( "Аргумент факториала отрицателен" ,

n , __FILE__ , __LINE__ ) ;

}

/* Вычисляем факториал */

int accum = 1 ;

while ( n > 0 )

{

accum *= n ;

n-- ;

}

return accum ;

}

int main( int nNumberofArgs , char* pszArgs[ ] )

{

/* печать кириллицы, если Вы не установите программки gccrus.exe и g++rus.exe */

setlocale ( LC_ALL , ".1251" ) ;

try

{

/* Этот код работает корректно */

cout << "3! = " << factorial( 3 ) << endl ;

/* Здесь генерируется исключение */

cout << "Factorial of -1 is " << factorial( -1 ) << endl ;

/* Этот код остаётся невыполненным */

cout << "Factorial of 5 is " << factorial( 5 ) << endl ;

}

/* Перехват исключения */

catch( Exception e )

{

cout << "Ошибка: \n" << e.display( ) << endl ;

}

catch ( ... )

{

cout << "Неизвестное исключение" << endl ;

}

/* Пауза для того, чтобы посмотреть на результат работы программы */

system( "PAUSE" ) ; return 0 ;

}

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

_________________

296 стр. Часть 5. Полезные особенности

Встроенные макроопределения FILE и LINE представляют собой имя исходного - фото 315

«Встроенные макроопределения _FILE_ и _LINE_ представляют собой имя исходного файла и текущую строку в нём.»

[ Советы ]

Перехватчик исключения использует функцию-член display( ) для вывода сообщения об ошибке. Вывод программы выглядит следующим образом.

3 6 Ошибка Ошибка - фото 316

3! = 6

Ошибка:

Ошибка <���Аргумент факториала отрицателен — значение равно -1> @С:/Documents/Dial/CppDummy/CustomExceptionClass.срр-46

Press any key to continue...

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

class InvalidArgumentException : public Exception

{

public :

InvalidArgumentException( int arg , char*pFile , int nLine )

: Exception( "Некорректный аргумент" , pFile , nLine )

{

invArg = arg ;

}

virtual void display( ostream & out )

{

Exception::display( out ) ;

out << "Аргумент " << invArg << endl ;

}

protected :

int invArg ;

}

Вызывающая функция автоматически обработает новое исключение, поскольку InvalidArgumentException ЯВЛЯЕТСЯ Exception , а функция-член display( ) — полиморфна.

_________________

297 стр. Глава 25. Обработка ошибок и исключения

Глава 26. МНОЖЕСТВЕННОЕ НАСЛЕДОВАНИЕ...298

ОГЛАВЛЕНИЕ

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «С++ для чайников .»

Представляем Вашему вниманию похожие книги на «С++ для чайников .» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «С++ для чайников .»

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

x