Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

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

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

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

Пишу курсовую работу на тему, аналогичную заголовку этой темы. Проблема в том, что у нас убрали пары по программированию во втором семестре. Поэтому мы так и не знаем толком ничего. Я бы хотел попросить уважаемых форумчан о помощи: нет ли у кого простенькой программы которая использовала бы исключения (нужно для практической части курсовой). В практической части мне нужно сравнить программу без использования исключений и с их присутствием. Буду очень рад любой помощи. Для практической части мне подойдёт самый что ни на есть простой пример. Может у кого-нибудь, что-нибудь да есть?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Buckstabue
175 / 124 / 6
Регистрация: 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;
}
Yafik
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 3
19.05.2012, 22:51  [ТС]     Механизмы обработки исключений / Нужен пример #3
Спасибо, огромное! Если не сложно, нельзя описать что именно делает программа?
Я с удовольствием готов отблагодарить (пиши в ЛС)
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
19.05.2012, 22:56     Механизмы обработки исключений / Нужен пример #4
Да ровным счётом ничего программа и не делает , просто демонстрирует разные способы идентификации ошибок: через исключения, через функцию возвращающую код ошибки и через void-функцию устанавливающую код ошибки
Yafik
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 3
19.05.2012, 23:02  [ТС]     Механизмы обработки исключений / Нужен пример #5
У меня сейчас просто нет компилятора под рукой, я вот глазами пробежал и тоже действий не увидил. А возможно ли как-то её связать с курсовой? там как раз и нужно это все продемонстрировать))) там вообще входные данные нужны какие-нибудь?
Buckstabue
175 / 124 / 6
Регистрация: 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;
   }
}
SlavaMos
0 / 0 / 0
Регистрация: 20.08.2012
Сообщений: 4
21.08.2012, 23:00     Механизмы обработки исключений / Нужен пример #7
А у меня ошибку выдает, когда пытаюсь с исключениям код откомпилировать.
Миниатюры
Механизмы обработки исключений / Нужен пример  
4iFF
19 / 19 / 1
Регистрация: 06.07.2012
Сообщений: 88
22.08.2012, 01:19     Механизмы обработки исключений / Нужен пример #8
Yafik, обработка исключений подробно описывается в "Как программировать на С++" (глава 16, 5\е). Должно помочь в понимание темы.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6411 / 3050 / 300
Регистрация: 04.12.2011
Сообщений: 8,260
Записей в блоге: 3
22.08.2012, 01:48     Механизмы обработки исключений / Нужен пример #9
Мне нравятся эти книжки, если для начала:
"Программирование. Принципы и практика использовния С++" Б. Страуструп //расписана логика
//для человека никогда об исключениях не слыхавшего. Видно, чем в принципе, механизм встроенный в язык //отличается, от обработки ошибок своими силами.
"С++ Базовый курс." Герберт Шилдт //кратко, строго и четко изложено.
//вместе эти книжки, ещё лучше чем по-одельности, но это дело вкуса и вопрос Вашей подготовки.
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
22.08.2012, 03:31     Механизмы обработки исключений / Нужен пример #10
Цитата Сообщение от SlavaMos Посмотреть сообщение
А у меня ошибку выдает, когда пытаюсь с исключениям код откомпилировать.
Там пример для консольного приложения...

То что должно выводится в консоль выводится окошком...
KoNstuNN
1 / 1 / 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", т.к. его использовать - это не по фен-шую
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 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)
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.04.2013, 22:48     Механизмы обработки исключений / Нужен пример #13
Цитата Сообщение от KoNstuNN Посмотреть сообщение
P.S. Кроме "goto", т.к. его использовать - это не по фен-шую
Не только не по феншую, но ещё и стандартом запрещается. Ну и вообще да, неправильный ввод пользователя — это не ошибка или исключение.
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
05.04.2013, 23:02     Механизмы обработки исключений / Нужен пример #14
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
это не ошибка или исключение
Может "исключение, а не ошибка" ? имелось ввиду.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.04.2013, 23:18     Механизмы обработки исключений / Нужен пример #15
Нет, именно так, как написано. Это не ошибка. Это не исключительная ситуация. "Я не могу понять, что за фигню ты тут написал" — это один из вполне ожидаемых результатов разбора ввода пользователя. Не надо его выделять в какую-то особую категорию (ну, кроме того, что этот результат [на логическом уровне] требует повторной попытки ввода). Как вы и сказали, код возврата был бы более закономерным способом сообщить об этом, нежели исключения.
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
05.04.2013, 23:19     Механизмы обработки исключений / Нужен пример #16
Как и исключение...

С текстового поля получается данные, которые конвертятЬся в int если неудачно исключение - типичная ситуация ...
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.04.2013, 23:26     Механизмы обработки исключений / Нужен пример #17
Ну, как сказать... Это больше философский вопрос: что считать ошибкой, исключением и нормальным результатом. Есть вообще exception-driven языки вроде Питона, где даже выход из цикла (в том числе нормальный) выполняется с помощью исключений.
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
05.04.2013, 23:30     Механизмы обработки исключений / Нужен пример #18
Ну исключение != ошибка ...
Исключение может быть вполне нормальным результатом- например исключение при получении ответа сервера с кодом 302 - "перенаправление"
KoNstuNN
1 / 1 / 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'а про цикл...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2013, 17:43     Механизмы обработки исключений / Нужен пример
Еще ссылки по теме:

Привести пример обработки и преобразования матриц, используя динамическое выделение памяти C++
C++ Нужен пример с массивами
C++ Нужен пример класса
Нужен пример классов C++
Как лучше построить механизм обработки ошибок на основе исключений? C++

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

Или воспользуйтесь поиском по форуму:
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
06.04.2013, 17:43     Механизмы обработки исключений / Нужен пример #20
Цитата Сообщение от KoNstuNN Посмотреть сообщение
Вот мой код:
printf/scanf + VCL классы - криво ...
А главное ввод через одно место буфер .

Используй iostream он хотя бы VCL более или менее совместим. (точнее VCL c ним )
Yandex
Объявления
06.04.2013, 17:43     Механизмы обработки исключений / Нужен пример
Ответ Создать тему
Опции темы

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