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

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

Войти
Регистрация
Восстановить пароль
 
Дантe
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 28
#1

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

09.07.2014, 15:05. Просмотров 680. Ответов 11
Метки нет (Все метки)

Всем приветю У меня возникла такая ситуация: в 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++
Есть функция, которая определенным образом работает с файлами,но при работе с файлами &quot;не подходящего&quot; типа вызывается необработанное...

Exception Handling. Собственный класс для перехвата исключений - C++
Помогите, пожалуйста, с данной задачей. Задача: Define an exception class called tornadoException. The class should have two...

Создание своего класса исключений, наследование std::exception - C++
хотел создать свой класс исключений пронаследовав от std::exception, но немного запутался в конструкторах... конструктор же не наследуется,...

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

Обработка исключений - C++
Объясните мне толком для чего используются эти обработки исключений (Try, catch, throw). Сколько не читаю, не могу понять для чего и как...

Обработка исключений - C++
Почему не перехватывает ошибку и не выводит Error? а прога сама прекращает работу. #include &lt;iostream&gt; using namespace std; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
nmcf
5309 / 4629 / 1550
Регистрация: 14.04.2014
Сообщений: 18,437
09.07.2014, 15:18 #2
По состоянию cin проверяй, не надо передавать в класс. Если введут буквы вместо числа, то по empID ты это никак не определишь.
Дантe
0 / 0 / 0
Регистрация: 28.04.2013
Сообщений: 28
09.07.2014, 15:30  [ТС] #3
ок, а если мне допустим надо, чтобы нельзя было ввести (присвоить объкту значение) большее число, чем тип long или нельзя вводить число меньше 12? Как это правильно обработать с помощь класса Exception? У меня почемуто, при введении 0, все корректно работает, если ввожу отрицательное значение, то выводится на экран только само значение, без самого сообщения "Invalid ID ". Если ввожу 4, то часть сообщения теряеться "lid ID " выводиться.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.07.2014, 15:36 #4
Цитата Сообщение от Дантe Посмотреть сообщение
ок, а если мне допустим надо, чтобы нельзя было ввести (присвоить объкту значение) большее число, чем тип long или нельзя вводить число меньше 12?
Считывать строку целиком и пытаться преобразовать. Пример подобного можно увидеть в языке C#.
Ilot
Модератор
Эксперт С++
1809 / 1166 / 227
Регистрация: 16.05.2013
Сообщений: 3,071
Записей в блоге: 5
Завершенные тесты: 1
09.07.2014, 15:43 #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
1052 / 715 / 105
Регистрация: 12.04.2010
Сообщений: 1,810
09.07.2014, 15:58 #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  [ТС] #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
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
09.07.2014, 16:34 #8
Дантe, я бы не рекомендовал исключения создавать через new. Провоцирует потенциальные утечки.
Лучше все-таки кидать по значению, а ловить по ссылке.
Ilot
Модератор
Эксперт С++
1809 / 1166 / 227
Регистрация: 16.05.2013
Сообщений: 3,071
Записей в блоге: 5
Завершенные тесты: 1
09.07.2014, 16:40 #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
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
09.07.2014, 18:13 #10
А можно просто включить выброс исключений из потоков
Ilot
Модератор
Эксперт С++
1809 / 1166 / 227
Регистрация: 16.05.2013
Сообщений: 3,071
Записей в блоге: 5
Завершенные тесты: 1
10.07.2014, 08:15 #11
Цитата Сообщение от Voivoid Посмотреть сообщение
А можно просто включить выброс исключений из потоков
Уже предлогалось в посте №5, но ТС упорно желает запилить что-то свое
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2014, 12:32 #12
Цитата Сообщение от Ilot Посмотреть сообщение
Уже предлогалось в посте №5, но ТС упорно желает запилить что-то свое

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2014, 12:32
Привет! Вот еще темы с ответами:

Обработка исключений - C++
Уважаемые админы. Знаю, что о помощи надо просить, когда имеются хоть какие-то наработки. К сожалению, тему исключений мало разбирала. А...

обработка исключений - C++
Есть вот такой код: #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int _tmain(int argc, _TCHAR* argv) { ...

Обработка исключений - C++
Здравствуйте! Есть вот такое выражение: Подскажите пожалуйста, как правильно реализовать обработку исключений. И у меня не...

Обработка исключений - C++
Как в блоке Try...Catch... обработать необработанное исключение по адресу? Что необходимо использовать в параметрах catch?


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

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

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