Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

Нужен пример классов - C++
Привести пример классов с наследованием и доступом к компонентам их экземпляров через указатели на базовый и производный классы.

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;
}
1
Yafik
0 / 0 / 0
Регистрация: 19.05.2012
Сообщений: 3
19.05.2012, 22:51  [ТС] #3
Спасибо, огромное! Если не сложно, нельзя описать что именно делает программа?
Я с удовольствием готов отблагодарить (пиши в ЛС)
0
Buckstabue
175 / 124 / 6
Регистрация: 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
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;
   }
}
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
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
22.08.2012, 01:48 #9
Мне нравятся эти книжки, если для начала:
"Программирование. Принципы и практика использовния С++" Б. Страуструп //расписана логика
//для человека никогда об исключениях не слыхавшего. Видно, чем в принципе, механизм встроенный в язык //отличается, от обработки ошибок своими силами.
"С++ Базовый курс." Герберт Шилдт //кратко, строго и четко изложено.
//вместе эти книжки, ещё лучше чем по-одельности, но это дело вкуса и вопрос Вашей подготовки.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,047
Записей в блоге: 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
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,047
Записей в блоге: 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
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.04.2013, 22:48 #13
Цитата Сообщение от KoNstuNN Посмотреть сообщение
P.S. Кроме "goto", т.к. его использовать - это не по фен-шую
Не только не по феншую, но ещё и стандартом запрещается. Ну и вообще да, неправильный ввод пользователя — это не ошибка или исключение.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,047
Записей в блоге: 17
05.04.2013, 23:02 #14
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
это не ошибка или исключение
Может "исключение, а не ошибка" ? имелось ввиду.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
05.04.2013, 23:18 #15
Нет, именно так, как написано. Это не ошибка. Это не исключительная ситуация. "Я не могу понять, что за фигню ты тут написал" — это один из вполне ожидаемых результатов разбора ввода пользователя. Не надо его выделять в какую-то особую категорию (ну, кроме того, что этот результат [на логическом уровне] требует повторной попытки ввода). Как вы и сказали, код возврата был бы более закономерным способом сообщить об этом, нежели исключения.
0
05.04.2013, 23:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2013, 23:18
Привет! Вот еще темы с ответами:

Нужен пример с массивами - C++
Не могу догнать, зачем нужен массив конкретно.

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

Нужен пример хэширования - C++
Здравствуйте! Ни как не могу понять хэширование,если не трудно, то напишите какие нибудь простейшие примеры реализации. Заранее благодарю!

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


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

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

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