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

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

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


Пишу курсовую работу на тему, аналогичную заголовку этой темы. Проблема в том, что у нас убрали пары по программированию во втором семестре. Поэтому мы так и не знаем толком ничего. Я бы хотел попросить уважаемых форумчан о помощи: нет ли у кого простенькой программы которая использовала бы исключения (нужно для практической части курсовой). В практической части мне нужно сравнить программу без использования исключений и с их присутствием. Буду очень рад любой помощи. Для практической части мне подойдёт самый что ни на есть простой пример. Может у кого-нибудь, что-нибудь да есть?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2012, 21:06
Ответы с готовыми решениями:

Обработка исключений с пмощью структурированной обработки исключений
Есть функция, которая определенным образом работает с файлами,но при работе с файлами "не...

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

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

Проверить правильность обработки исключений
само уравнение - a - bx = sqrt(x+c); #include <windows.h> #include <cmath> #include <iostream>...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
21
179 / 127 / 25
Регистрация: 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
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 3
19.05.2012, 22:51  [ТС] 3
Спасибо, огромное! Если не сложно, нельзя описать что именно делает программа?
Я с удовольствием готов отблагодарить (пиши в ЛС)
0
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 624
19.05.2012, 22:56 4
Да ровным счётом ничего программа и не делает , просто демонстрирует разные способы идентификации ошибок: через исключения, через функцию возвращающую код ошибки и через void-функцию устанавливающую код ошибки
1
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 3
19.05.2012, 23:02  [ТС] 5
У меня сейчас просто нет компилятора под рукой, я вот глазами пробежал и тоже действий не увидил. А возможно ли как-то её связать с курсовой? там как раз и нужно это все продемонстрировать))) там вообще входные данные нужны какие-нибудь?
0
179 / 127 / 25
Регистрация: 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
0 / 0 / 0
Регистрация: 20.08.2012
Сообщений: 4
21.08.2012, 23:00 7
А у меня ошибку выдает, когда пытаюсь с исключениям код откомпилировать.
0
Миниатюры
Механизмы обработки исключений / Нужен пример  
20 / 20 / 1
Регистрация: 06.07.2012
Сообщений: 88
22.08.2012, 01:19 8
Yafik, обработка исключений подробно описывается в "Как программировать на С++" (глава 16, 5\е). Должно помочь в понимание темы.
1
Комп_Оратор)
Эксперт по математике/физике
8640 / 4352 / 592
Регистрация: 04.12.2011
Сообщений: 13,019
Записей в блоге: 16
22.08.2012, 01:48 9
Мне нравятся эти книжки, если для начала:
"Программирование. Принципы и практика использовния С++" Б. Страуструп //расписана логика
//для человека никогда об исключениях не слыхавшего. Видно, чем в принципе, механизм встроенный в язык //отличается, от обработки ошибок своими силами.
"С++ Базовый курс." Герберт Шилдт //кратко, строго и четко изложено.
//вместе эти книжки, ещё лучше чем по-одельности, но это дело вкуса и вопрос Вашей подготовки.
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,392
Записей в блоге: 29
22.08.2012, 03:31 10
Цитата Сообщение от SlavaMos Посмотреть сообщение
А у меня ошибку выдает, когда пытаюсь с исключениям код откомпилировать.
Там пример для консольного приложения...

То что должно выводится в консоль выводится окошком...
0
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
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,392
Записей в блоге: 29
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
~ Эврика! ~
1254 / 1003 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
05.04.2013, 22:48 13
Цитата Сообщение от KoNstuNN Посмотреть сообщение
P.S. Кроме "goto", т.к. его использовать - это не по фен-шую
Не только не по феншую, но ещё и стандартом запрещается. Ну и вообще да, неправильный ввод пользователя — это не ошибка или исключение.
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,392
Записей в блоге: 29
05.04.2013, 23:02 14
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
это не ошибка или исключение
Может "исключение, а не ошибка" ? имелось ввиду.
0
~ Эврика! ~
1254 / 1003 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
05.04.2013, 23:18 15
Нет, именно так, как написано. Это не ошибка. Это не исключительная ситуация. "Я не могу понять, что за фигню ты тут написал" — это один из вполне ожидаемых результатов разбора ввода пользователя. Не надо его выделять в какую-то особую категорию (ну, кроме того, что этот результат [на логическом уровне] требует повторной попытки ввода). Как вы и сказали, код возврата был бы более закономерным способом сообщить об этом, нежели исключения.
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,392
Записей в блоге: 29
05.04.2013, 23:19 16
Как и исключение...

С текстового поля получается данные, которые конвертятЬся в int если неудачно исключение - типичная ситуация ...
1
~ Эврика! ~
1254 / 1003 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
05.04.2013, 23:26 17
Ну, как сказать... Это больше философский вопрос: что считать ошибкой, исключением и нормальным результатом. Есть вообще exception-driven языки вроде Питона, где даже выход из цикла (в том числе нормальный) выполняется с помощью исключений.
0
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,392
Записей в блоге: 29
05.04.2013, 23:30 18
Ну исключение != ошибка ...
Исключение может быть вполне нормальным результатом- например исключение при получении ответа сервера с кодом 302 - "перенаправление"
0
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
Эксперт С++
8354 / 6092 / 610
Регистрация: 10.12.2010
Сообщений: 28,392
Записей в блоге: 29
06.04.2013, 17:43 20
Цитата Сообщение от KoNstuNN Посмотреть сообщение
Вот мой код:
printf/scanf + VCL классы - криво ...
А главное ввод через одно место буфер .

Используй iostream он хотя бы VCL более или менее совместим. (точнее VCL c ним )
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2013, 17:43

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

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

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

Нужен пример внешней обработки заполнения табличной части для управляемых форм
Ребят у кого есть хороший пример внешней обработки, для заполнения табличной части (Управляемые...

Библиотека обработки исключений на Си
Здравствуйте. Есть ли для си какие либо стоящие библиотеки структурной обработки исключений? Каким...


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

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

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