Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.81
Yafik
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 3
#1

Механизмы обработки исключений / Нужен пример - C++

19.05.2012, 21:06. Просмотров 4555. Ответов 21
Метки нет (Все метки)

Пишу курсовую работу на тему, аналогичную заголовку этой темы. Проблема в том, что у нас убрали пары по программированию во втором семестре. Поэтому мы так и не знаем толком ничего. Я бы хотел попросить уважаемых форумчан о помощи: нет ли у кого простенькой программы которая использовала бы исключения (нужно для практической части курсовой). В практической части мне нужно сравнить программу без использования исключений и с их присутствием. Буду очень рад любой помощи. Для практической части мне подойдёт самый что ни на есть простой пример. Может у кого-нибудь, что-нибудь да есть?
http://www.cyberforum.ru/cpp-beginners/thread686061.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2012, 21:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Механизмы обработки исключений / Нужен пример (C++):

Mingw и отключение обработки исключений
Даю Mingw флаги nostdlib и fno-exceptions, скармливаю программу из одной...

Создание обработки исключений на даты
Доброго времени суток! Как создать обработку исключительных ситуаций на...

Как лучше построить механизм обработки ошибок на основе исключений?
Доброго дня! Я сейчас разрабатываю проект и хочу спросить: как лучше построить...

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

Нужен пример интерфейса
Помагите нужен пример интерфейса на С++. В заранее благодарен.

21
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
19.05.2012, 22:00 #2
Вот самый простейший пример использование перехвата ошибок как с исключениями, так и через функции возвращающие/устанавливающие код ошибки
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
#include <cstring>
#include <stdexcept>
 
 
void withException(); // с исключениями
int returnErrorCode(); // возвращет код ошибки
void withSetErrorCode( int *err ); // устанавливает код ошибки
 
class myException : public std::exception
{
   public:
      myException( const char * errStr );
      ~myException() throw();
      const char * what();
   private:
      char *errMesage;
};
 
myException::myException( const char *errStr )
{
   if ( errStr != NULL )
   {
      const int ERRSTR_SIZE = strlen( errStr );
      errMesage = new char[ ERRSTR_SIZE + 1 ];
 
      strncpy( errMesage, errStr, ERRSTR_SIZE );
      errMesage[ ERRSTR_SIZE ] = '\0';
   }
   else
   {
      errMesage = NULL;
   }
}
 
myException::~myException() throw()
{
   if ( errMesage )
   {
      delete[] errMesage;
   }
}
 
const char * myException::what()
{
   if ( errMesage )
      return errMesage;
   else
      return "myException";
}
 
int main()
{
   try
   {
      withException();
   }
   catch ( myException &e )
   {
      std::cout << e.what() << std::endl;
   }
   ////////////////////////////
   int ret = returnErrorCode();
 
   if ( ret != 0 )
   {
      std::cout << "Erorr in returnErrorCode()" << std::endl;
   }
   ////////////////////////////
   int err = 0;
 
   withSetErrorCode( &err );
 
   if ( err != 0 )
   {
      std::cout << "Erorr in withSetErrorCode()" << std::endl;
   }
   //////////////////////////////
 
   return 0;
 
}
 
void withException()
{
   throw myException( "Exception at withException()" );
}
 
int returnErrorCode()
{
   return -1;
}
 
void withSetErrorCode( int *err )
{
   *err = -1;
}
1
Yafik
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 3
19.05.2012, 22:51  [ТС] #3
Спасибо, огромное! Если не сложно, нельзя описать что именно делает программа?
Я с удовольствием готов отблагодарить (пиши в ЛС)
0
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
19.05.2012, 22:56 #4
Да ровным счётом ничего программа и не делает , просто демонстрирует разные способы идентификации ошибок: через исключения, через функцию возвращающую код ошибки и через void-функцию устанавливающую код ошибки
1
Yafik
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 3
19.05.2012, 23:02  [ТС] #5
У меня сейчас просто нет компилятора под рукой, я вот глазами пробежал и тоже действий не увидил. А возможно ли как-то её связать с курсовой? там как раз и нужно это все продемонстрировать))) там вообще входные данные нужны какие-нибудь?
0
Buckstabue
177 / 126 / 24
Регистрация: 12.01.2012
Сообщений: 624
19.05.2012, 23:07 #6
Нет, не нужны. Но сделать это 5 секунд. Например, программа вычисляющая деление двух чисел
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream>
#include <cstring>
#include <stdexcept>
#include <clocale>
 
 
void withException( double a, double b ); // с исключениями
int returnErrorCode( double a, double b ); // возвращет код ошибки
void withSetErrorCode( double a, double b, int *err ); // устанавливает код ошибки
 
class myException : public std::exception
{
   public:
      myException( const char * errStr );
      ~myException() throw();
      const char * what();
   private:
      char *errMesage;
};
 
myException::myException( const char *errStr )
{
   if ( errStr != NULL )
   {
      const int ERRSTR_SIZE = strlen( errStr );
      errMesage = new char[ ERRSTR_SIZE + 1 ];
 
      strncpy( errMesage, errStr, ERRSTR_SIZE );
      errMesage[ ERRSTR_SIZE ] = '\0';
   }
   else
   {
      errMesage = NULL;
   }
}
 
myException::~myException() throw()
{
   if ( errMesage )
   {
      delete[] errMesage;
   }
}
 
const char * myException::what()
{
   if ( errMesage )
      return errMesage;
   else
      return "myException";
}
 
int main()
{
   setlocale( LC_ALL, NULL );
 
   double a, b;
 
   std::cout << "Введите a и b через пробел: ";
   std::cin >> a >> b;
 
   try
   {
      withException( a, b );
   }
   catch ( myException &e )
   {
      std::cout << e.what() << std::endl;
   }
   ////////////////////////////
   int ret = returnErrorCode( a, b );
 
   if ( ret != 0 )
   {
      std::cout << "Erorr in returnErrorCode()" << std::endl;
   }
   ////////////////////////////
   int err = 0;
 
   withSetErrorCode( a, b, &err );
 
   if ( err != 0 )
   {
      std::cout << "Erorr in withSetErrorCode()" << std::endl;
   }
   //////////////////////////////
 
   return 0;
 
}
 
void withException( double a, double b)
{
   if ( b == 0 )
   {
      throw myException( "Exception at withException()" );
   }
   else
   {
      std::cout << "a/b = " << (a / b) << std::endl;
   }
}
 
int returnErrorCode(double a, double b)
{
   if ( b == 0 )
      return -1;
   else
   {
      std::cout << "a/b = " << (a / b) << std::endl;
   }
 
   return 0;
}
 
void withSetErrorCode( double a, double b, int *err )
{
   if ( b == 0 )
   {
      *err = -1;
      return;
   }
   else
   {
      *err = 0;
      std::cout << "a/b = " << (a / b) << std::endl;
   }
}
3
SlavaMos
0 / 0 / 0
Регистрация: 20.08.2012
Сообщений: 4
21.08.2012, 23:00 #7
А у меня ошибку выдает, когда пытаюсь с исключениям код откомпилировать.
0
Миниатюры
Механизмы обработки исключений / Нужен пример  
4iFF
19 / 19 / 1
Регистрация: 06.07.2012
Сообщений: 88
22.08.2012, 01:19 #8
Yafik, обработка исключений подробно описывается в "Как программировать на С++" (глава 16, 5\е). Должно помочь в понимание темы.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
7004 / 3297 / 448
Регистрация: 04.12.2011
Сообщений: 9,124
Записей в блоге: 5
22.08.2012, 01:48 #9
Мне нравятся эти книжки, если для начала:
"Программирование. Принципы и практика использовния С++" Б. Страуструп //расписана логика
//для человека никогда об исключениях не слыхавшего. Видно, чем в принципе, механизм встроенный в язык //отличается, от обработки ошибок своими силами.
"С++ Базовый курс." Герберт Шилдт //кратко, строго и четко изложено.
//вместе эти книжки, ещё лучше чем по-одельности, но это дело вкуса и вопрос Вашей подготовки.
0
Avazart
Эксперт С++
7676 / 5585 / 542
Регистрация: 10.12.2010
Сообщений: 25,057
Записей в блоге: 17
22.08.2012, 03:31 #10
Цитата Сообщение от SlavaMos Посмотреть сообщение
А у меня ошибку выдает, когда пытаюсь с исключениям код откомпилировать.
Там пример для консольного приложения...

То что должно выводится в консоль выводится окошком...
0
KoNstuNN
2 / 2 / 0
Регистрация: 18.02.2012
Сообщений: 21
05.04.2013, 19:53 #11
Цитата Сообщение от SlavaMos Посмотреть сообщение
А у меня ошибку выдает, когда пытаюсь с исключениям код откомпилировать.
Не "откомпилировать", а запустить и отладить. На скриншоте видно, что компиляция и сборка проекта у Вас прошла успешно. Debugger Exception Notification - это оповещение отладчика об исключении, это нормально.
Чтобы отключить эти оповещения, нужно зайти в меню "Tools->Debugger Options" и во вкладке "Language Exceptions" убрать галочку(-и) "Stop Delphi(и\или C++) Exceptions".

Добавлено через 16 минут
У меня у самого есть вопрос. Как при(после) обработке(и) исключения осуществить переход обратно в то место кода, заключенного в блоке "try", где это исключение "выбросилось"? Ведь по-умолчанию, после обработки выполняется код, написанный после блока "catch".
К примеру, юзеру предлагается ввести целое число. Если он вводит вместо числа символ , то нужно вывести ошибку и заставить его повторить ввод.
P.S. Кроме "goto", т.к. его использовать - это не по фен-шую
0
Avazart
Эксперт С++
7676 / 5585 / 542
Регистрация: 10.12.2010
Сообщений: 25,057
Записей в блоге: 17
05.04.2013, 19:56 #12
Тут удобнее через код возврата конечно.
Но не что не мешает поместить код в цикл.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
bool ok= false;
do
 {
    try{
            doSomething();
            ok= true;
        }
   catch(const someExc& e)
        {
            ok= false;
            std::cerr<<e.what()<<std::endl;
        }
  }while(!ok)
2
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
05.04.2013, 22:48 #13
Цитата Сообщение от KoNstuNN Посмотреть сообщение
P.S. Кроме "goto", т.к. его использовать - это не по фен-шую
Не только не по феншую, но ещё и стандартом запрещается. Ну и вообще да, неправильный ввод пользователя — это не ошибка или исключение.
0
Avazart
Эксперт С++
7676 / 5585 / 542
Регистрация: 10.12.2010
Сообщений: 25,057
Записей в блоге: 17
05.04.2013, 23:02 #14
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
это не ошибка или исключение
Может "исключение, а не ошибка" ? имелось ввиду.
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
05.04.2013, 23:18 #15
Нет, именно так, как написано. Это не ошибка. Это не исключительная ситуация. "Я не могу понять, что за фигню ты тут написал" — это один из вполне ожидаемых результатов разбора ввода пользователя. Не надо его выделять в какую-то особую категорию (ну, кроме того, что этот результат [на логическом уровне] требует повторной попытки ввода). Как вы и сказали, код возврата был бы более закономерным способом сообщить об этом, нежели исключения.
0
Avazart
Эксперт С++
7676 / 5585 / 542
Регистрация: 10.12.2010
Сообщений: 25,057
Записей в блоге: 17
05.04.2013, 23:19 #16
Как и исключение...

С текстового поля получается данные, которые конвертятЬся в int если неудачно исключение - типичная ситуация ...
1
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
05.04.2013, 23:26 #17
Ну, как сказать... Это больше философский вопрос: что считать ошибкой, исключением и нормальным результатом. Есть вообще exception-driven языки вроде Питона, где даже выход из цикла (в том числе нормальный) выполняется с помощью исключений.
0
Avazart
Эксперт С++
7676 / 5585 / 542
Регистрация: 10.12.2010
Сообщений: 25,057
Записей в блоге: 17
05.04.2013, 23:30 #18
Ну исключение != ошибка ...
Исключение может быть вполне нормальным результатом- например исключение при получении ответа сервера с кодом 302 - "перенаправление"
0
KoNstuNN
2 / 2 / 0
Регистрация: 18.02.2012
Сообщений: 21
06.04.2013, 17:40 #19
Чтобы уважаемым профессионалам не гадать на кофейной гуще и не уходить в философию... ;-)
Вот мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
int main()
{
    /* bla-bla-bla  */
    try
    {
        scanf("%s", buf);
        custom_surname_count = StrToInt(AnsiString(buf));
 
        for (int i=0; i<custom_surname_count; i++)
        {
            printf("Input surname: ");
            scanf("%s", buf);
            surname_buf = AnsiString(buf);
            printf("Input date in format 'dd.mm.yyyy': ");
            scanf("%s", buf);
            p = strtok(buf, ".");
            day = StrToInt(AnsiString(p));
            p = strtok(NULL, ".");
            month = StrToInt(AnsiString(p));
            p = strtok(NULL, ".");
            year = StrToInt(AnsiString(p));
            Bday.insert(make_pair(AnsiString(surname_buf), TDateTime(year,month,day)));
        }
 
        //display full list
        printf("List:\n");
        for (it=Bday.begin(); it!=Bday.end(); ++it)
        {
            printf("%s ", (it->first).c_str());
            printf("%s\n", ((it->second).FormatString("dd.mm.yyyy")).c_str());
        }
        
        //start searching
        printf("Input surname to search: ");
        scanf("%s", buf);
 
        //searching
        printf("Searching...");
        it = Bday.find(AnsiString(buf));
        printf("Completed.\n");
 
        //showing results
        if (it!=Bday.end())
        {
            printf("Results:\n");
            printf("%s ", (it->first).c_str());
            printf("%s\n", ((it->second).FormatString("dd.mm.yyyy")).c_str());
        }
        else
        {
            printf("'%s' not found\n", buf);
        }
    }
    catch(const Exception& ex)
    {
        printf("Exception: %s\n", ex.Message.c_str());
        printf("The program will be terminated.\n");
    }
    system("pause");
    return 0;
}
Сам принудительно никаких исключений не кидаю - поручил это умным методам классов AnsiString, TDateTime и пр.
Больше всего мне, наверное, подходит идея Avazart'а про цикл...
0
Avazart
Эксперт С++
7676 / 5585 / 542
Регистрация: 10.12.2010
Сообщений: 25,057
Записей в блоге: 17
06.04.2013, 17:43 #20
Цитата Сообщение от KoNstuNN Посмотреть сообщение
Вот мой код:
printf/scanf + VCL классы - криво ...
А главное ввод через одно место буфер .

Используй iostream он хотя бы VCL более или менее совместим. (точнее VCL c ним )
0
06.04.2013, 17:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2013, 17:43
Привет! Вот еще темы с решениями:

Нужен пример класса
Привести пример класса для работы с комплексными числами и содержащего...

Нужен пример классов
Привести пример классов с наследованием и доступом к компонентам их экземпляров...

Нужен пример цикла while
Помогите решить задачку или хотябы обьясните как делать а то сижу и думаю как...

Нужен пример хэширования
Здравствуйте! Ни как не могу понять хэширование,если не трудно, то напишите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru