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

Обработка исключений (Exception) - C++

Восстановить пароль Регистрация
 
Дантe
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 28
09.07.2014, 15:05     Обработка исключений (Exception) #1
Всем приветю У меня возникла такая ситуация: в main создаю локальную переменную типа long, затем прошу пользователя задать эту переменную и потом эту переменную передаю в объект с помощью set функции. Не знаю, как правильно обработать исключения, наподобии, если было введено не не long, а что нибуть еще или больше его размера.

класс для обработки исключений:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Exception
{
 public:
  long ID;
  std::string msg;
  Exception()
    {
            ID=0;
        msg="Invalid ID.";
    }
  Exception(long empID)
    {
        ID=empID;
        msg="Invalid ID " + ID;
    }
};
класс с функцией set:
C++
1
2
3
4
5
void Employee::setEmployeeID(long empID) throw (Exception*)
{
  if (empID <= 0) throw new Exception(empID);
    employeeID=empID;
}
маин:
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
int main()
{
  long empID = 0;
    Employee emp;
    
  cout << "Enter Employee ID : ";
  cin >> empID;
try {
  emp.setEmployeeID(empID);
}
catch(const Exception &e)
{
    cout << e.m_msg << " " << e.ID << endl;
}
catch(const Exception *e)
{
    cout << e->m_msg << " " << e->ID << endl;
    delete e;
}
catch(...)
{
    cout << "Something else ";
    throw -1;
}
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2014, 15:05     Обработка исключений (Exception)
Посмотрите здесь:

Обработка исключений C++
C++ обработка исключений
Обработка исключений C++
Обработка исключений с пмощью структурированной обработки исключений C++
Обработка исключений C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4301 / 3722 / 1255
Регистрация: 14.04.2014
Сообщений: 14,556
09.07.2014, 15:18     Обработка исключений (Exception) #2
По состоянию cin проверяй, не надо передавать в класс. Если введут буквы вместо числа, то по empID ты это никак не определишь.
Дантe
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 28
09.07.2014, 15:30  [ТС]     Обработка исключений (Exception) #3
ок, а если мне допустим надо, чтобы нельзя было ввести (присвоить объкту значение) большее число, чем тип long или нельзя вводить число меньше 12? Как это правильно обработать с помощь класса Exception? У меня почемуто, при введении 0, все корректно работает, если ввожу отрицательное значение, то выводится на экран только само значение, без самого сообщения "Invalid ID ". Если ввожу 4, то часть сообщения теряеться "lid ID " выводиться.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.07.2014, 15:36     Обработка исключений (Exception) #4
Цитата Сообщение от Дантe Посмотреть сообщение
ок, а если мне допустим надо, чтобы нельзя было ввести (присвоить объкту значение) большее число, чем тип long или нельзя вводить число меньше 12?
Считывать строку целиком и пытаться преобразовать. Пример подобного можно увидеть в языке C#.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
09.07.2014, 15:43     Обработка исключений (Exception) #5
Классически:
C++
1
2
3
    short a;
    if(!(std::cin >> a))
        std::cout << "Error.\n" ;
Пользовательский ввод обычно не относят к исключительным ситуациям. Но если уж неймется то принудительно прикручивайте исключения http://www.cplusplus.com/reference/i...os/exceptions/ и юзайте стандартные исключения http://www.cplusplus.com/reference/stdexcept/

Добавлено через 6 минут
И еще. У вас в конструкторе может исключение возникнуть:
C++
1
2
3
4
5
Exception()
    {
            ID=0;
        msg="Invalid ID."; <- Тута
    }
Как собираетесь поступать в таком случае?
А эта строчка вообще кошмар:
C++
1
        msg="Invalid ID " + ID;
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
09.07.2014, 15:58     Обработка исключений (Exception) #6
Цитата Сообщение от Дантe Посмотреть сообщение
C++
1
msg="Invalid ID " + ID;
Здесь значение ID будет прибавлено к указателю. Например, если ID==2, то результатом "Invalid ID " + ID; будет указатель на строку "valid ID ".
Дантe
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 28
09.07.2014, 16:18  [ТС]     Обработка исключений (Exception) #7
Так будет правильно обрабатывать?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Exception
{
 public:
  double pay;
  std::string msg;
 
  Exception()
    {
        pay=0.0;
        msg="Invalid Pay.";
 
    }
  Exception(double ppay)
    {
      pay = ppay;
      std::ostringstream oss;
      oss << pay;
      msg = "Invalid Pay ";
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
void Employee::setPay(double HomePay) throw (class Exception*)
{
  std::cout << "void Employee::setPay" << std::endl;
try {
    Pay=HomePay) ;
}
catch(const Exception *e)
{
    std::cout << "Error" << e->msg << e->pay << std::endl;
    delete e;
}
}
DrOffset
6442 / 3816 / 885
Регистрация: 30.01.2014
Сообщений: 6,610
09.07.2014, 16:34     Обработка исключений (Exception) #8
Дантe, я бы не рекомендовал исключения создавать через new. Провоцирует потенциальные утечки.
Лучше все-таки кидать по значению, а ловить по ссылке.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
09.07.2014, 16:40     Обработка исключений (Exception) #9
Цитата Сообщение от Дантe Посмотреть сообщение
Так будет правильно обрабатывать?
Почему вы не хотите слушать?
Ваша реализация класса исключений крайне неэффективна и потенциально опасна. Вы бы не поленились и перешли бы по ссылкам которые вам указали. Там бы вы обратили внимание, что стандартные классы исключений не содержат полей. Вся информация возвращается функцией what.
В вашем случае будет лучше Создать строку с описанием ошибки и сгенериировать стандартный объект исключения.
Например:
C++
1
2
3
4
5
6
7
8
9
string str("Invalid ID ");
//...
str += ID;
//...
... throw  invalid_argument(str);
//...
catch (const invalid_argument& ia) {
    std::cerr << ia.what() << '\n';
}
Или парсите свою строку как хотите...
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
09.07.2014, 18:13     Обработка исключений (Exception) #10
А можно просто включить выброс исключений из потоков
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
10.07.2014, 08:15     Обработка исключений (Exception) #11
Цитата Сообщение от Voivoid Посмотреть сообщение
А можно просто включить выброс исключений из потоков
Уже предлогалось в посте №5, но ТС упорно желает запилить что-то свое
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2014, 12:32     Обработка исключений (Exception)
Еще ссылки по теме:

C++ Обработка исключений
Обработка исключений C++
Создание своего класса исключений, наследование std::exception C++

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

Или воспользуйтесь поиском по форуму:
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
10.07.2014, 12:32     Обработка исключений (Exception) #12
Цитата Сообщение от Ilot Посмотреть сообщение
Уже предлогалось в посте №5, но ТС упорно желает запилить что-то свое

Не по теме:

Да, что-то пропустил.

Yandex
Объявления
10.07.2014, 12:32     Обработка исключений (Exception)
Ответ Создать тему
Опции темы

Текущее время: 17:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru