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

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

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

Студворк — интернет-сервис помощи студентам
Пишу курсовую работу на тему, аналогичную заголовку этой темы. Проблема в том, что у нас убрали пары по программированию во втором семестре. Поэтому мы так и не знаем толком ничего. Я бы хотел попросить уважаемых форумчан о помощи: нет ли у кого простенькой программы которая использовала бы исключения (нужно для практической части курсовой). В практической части мне нужно сравнить программу без использования исключений и с их присутствием. Буду очень рад любой помощи. Для практической части мне подойдёт самый что ни на есть простой пример. Может у кого-нибудь, что-нибудь да есть?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.05.2012, 21:06
Ответы с готовыми решениями:

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

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

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

21
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
19.05.2012, 22:00
Вот самый простейший пример использование перехвата ошибок как с исключениями, так и через функции возвращающие/устанавливающие код ошибки
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  [ТС]
Спасибо, огромное! Если не сложно, нельзя описать что именно делает программа?
Я с удовольствием готов отблагодарить (пиши в ЛС)
0
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
19.05.2012, 22:56
Да ровным счётом ничего программа и не делает , просто демонстрирует разные способы идентификации ошибок: через исключения, через функцию возвращающую код ошибки и через void-функцию устанавливающую код ошибки
1
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 3
19.05.2012, 23:02  [ТС]
У меня сейчас просто нет компилятора под рукой, я вот глазами пробежал и тоже действий не увидил. А возможно ли как-то её связать с курсовой? там как раз и нужно это все продемонстрировать))) там вообще входные данные нужны какие-нибудь?
0
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
19.05.2012, 23:07
Нет, не нужны. Но сделать это 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
А у меня ошибку выдает, когда пытаюсь с исключениям код откомпилировать.
Миниатюры
Механизмы обработки исключений / Нужен пример  
0
 Аватар для 4iFF
21 / 21 / 1
Регистрация: 06.07.2012
Сообщений: 88
22.08.2012, 01:19
Yafik, обработка исключений подробно описывается в "Как программировать на С++" (глава 16, 5\е). Должно помочь в понимание темы.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.08.2012, 01:48
Мне нравятся эти книжки, если для начала:
"Программирование. Принципы и практика использовния С++" Б. Страуструп //расписана логика
//для человека никогда об исключениях не слыхавшего. Видно, чем в принципе, механизм встроенный в язык //отличается, от обработки ошибок своими силами.
"С++ Базовый курс." Герберт Шилдт //кратко, строго и четко изложено.
//вместе эти книжки, ещё лучше чем по-одельности, но это дело вкуса и вопрос Вашей подготовки.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.08.2012, 03:31
Цитата Сообщение от SlavaMos Посмотреть сообщение
А у меня ошибку выдает, когда пытаюсь с исключениям код откомпилировать.
Там пример для консольного приложения...

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

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

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
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
05.04.2013, 22:48
Цитата Сообщение от KoNstuNN Посмотреть сообщение
P.S. Кроме "goto", т.к. его использовать - это не по фен-шую
Не только не по феншую, но ещё и стандартом запрещается. Ну и вообще да, неправильный ввод пользователя — это не ошибка или исключение.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.04.2013, 23:02
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
это не ошибка или исключение
Может "исключение, а не ошибка" ? имелось ввиду.
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
05.04.2013, 23:18
Нет, именно так, как написано. Это не ошибка. Это не исключительная ситуация. "Я не могу понять, что за фигню ты тут написал" — это один из вполне ожидаемых результатов разбора ввода пользователя. Не надо его выделять в какую-то особую категорию (ну, кроме того, что этот результат [на логическом уровне] требует повторной попытки ввода). Как вы и сказали, код возврата был бы более закономерным способом сообщить об этом, нежели исключения.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.04.2013, 23:19
Как и исключение...

С текстового поля получается данные, которые конвертятЬся в int если неудачно исключение - типичная ситуация ...
1
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
05.04.2013, 23:26
Ну, как сказать... Это больше философский вопрос: что считать ошибкой, исключением и нормальным результатом. Есть вообще exception-driven языки вроде Питона, где даже выход из цикла (в том числе нормальный) выполняется с помощью исключений.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.04.2013, 23:30
Ну исключение != ошибка ...
Исключение может быть вполне нормальным результатом- например исключение при получении ответа сервера с кодом 302 - "перенаправление"
0
2 / 2 / 0
Регистрация: 18.02.2012
Сообщений: 21
06.04.2013, 17:40
Чтобы уважаемым профессионалам не гадать на кофейной гуще и не уходить в философию... ;-)
Вот мой код:
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
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.04.2013, 17:43
Цитата Сообщение от KoNstuNN Посмотреть сообщение
Вот мой код:
printf/scanf + VCL классы - криво ...
А главное ввод через одно место буфер .

Используй iostream он хотя бы VCL более или менее совместим. (точнее VCL c ним )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.04.2013, 17:43
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru