Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
1

Исключения в классах

25.08.2012, 00:42. Показов 2265. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Какими средствами правильней всего сделать обработку исключений в классах?

C++
1
2
3
4
5
6
7
/* например, эта функция */
int SomeClass::someFunc( int some_arg ) { return some_arg * 18 }
/*
  для нормальной работы
  должна получать числа от 0 до 42. 
  Как реагировать на остальное?
*/
Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.08.2012, 00:42
Ответы с готовыми решениями:

Определить какие из имён встречаются во всех классах, только в некоторых классах, не встречаются ни в одном
1. Заданный имена девочек . Определить , какие из этих имён встречаются во всех классах данной...

Организация собственного исключения и передача в него исходного исключения
Для обработки исключений при работе с БД я создал собственное исключение: public class...

Определить, какие из этих имен встречаются во всех классах, какие есть хотя бы в двух классах, и какие - только в одном классе
Для каждого из четырех классов указаны имена девочек, обучающихся в них. Определить, какие из этих...

Заданы имена девочек. Определить, какие встречаются во всех классах, которые есть только в некоторых классах и какие не встречаются
Заданы имена девочек. Определить, какие из этих имен встречаются во всех классах данной параллели,...

18
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
25.08.2012, 00:58 2
вариантов много. зависит от того, как по концепции (желательно иметь в приложении) должны обрабатываться инвалидные аргументы. можно возвращать некий INVALID_INTEGER, можно бросать исключение (если оно где-то ловится), можно аварийно завершать приложение, занеся в протокол соотв. запись, можно ...
в общем, все, чего твоя фантазия пожелает.
1
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 01:08  [ТС] 3
Спасибо.

1. Как-то это некрасиво и в стиле C.
2. Эх, это ж еще ловить их надо…
3. Выход хороший, в конкретном случае не к месту.

Дело вот в чем: я вроде как разрабатываю набор классов, и было бы неплохо всякое неподобство разрешать наиболее общим и безболезненным методом.
Кстати, как-то можно выбрасывать ошибку еще при компиляции в случае "неподобства"?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.08.2012, 01:13 4
vortexx1, Только для того, что вы можете проверить на этапе компиляции. В данной функции на этапе компиляции вы ничего проверить не можете.
1
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 01:19 5
> 1. Как-то это некрасиво и в стиле C.
Это давний срач, что лучше: коды возврата или исключения. (И ассерты сверху.)

> 2. Эх, это ж еще ловить их надо…
Вот это один из минусов исключений, приводимый в тех срачах: исключения нельзя спокойно игнорировать. На код возврата можно спокойно забить.

> Кстати, как-то можно выбрасывать ошибку еще при компиляции в случае "неподобства"?
Только на шаблонной магии, но это слегка сложно, выглядит уродски и не работает для переменных.
В общем случае нельзя: у Си++ не настолько крутая система типов, чтобы ловить такие несоответствия при компиляции (тип "число от 0 до 42" можно ввести только своим классом). Функция выполняется не при компиляции, а при выполнении программы. Тогда же она выкидывает все ошибки.

Конкретное решение больше зависит от того, кому нужна эта ошибка, когда она может произойти и насколько она фатальна. То есть кто обязан следить за тем, чтобы число находилось в пределах [0; 42]. Универсальный вариант: выкинуть исключение, а дальше это уже проблемы того, кто передаёт мусор в вашу функцию.
2
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.08.2012, 01:28 6
Собственно примерно такие шаблонные функции обеспечивают проверку на этапе компиляции.

C++
1
2
3
4
5
6
template<int some_arg>
int SomeClass::someFunc() 
{ 
   static_assert(some_arg >= 0 && some_arg < 42, "asserted");
   return some_arg * 18;
}
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
25.08.2012, 01:37 7
никаких проблем! заведи себе ф-ю, которая принимает некий enum в этом роде:
C++
1
2
3
4
5
enum _0_to_42 {
 _0 = 0,
 _1,
...
 _42};
, и проблема решена. некрасиво, но как ты хочешь.
0
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 01:41  [ТС] 8
Хм, ForEveR, может, что-то вроде этого как раз и нужно. Как оно по-научному называется, чтоб можно было погуглить и почитать?

Добавлено через 1 минуту
novi4ok, неа, так точно не хочу.
Спасибо.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
25.08.2012, 01:45 9
Цитата Сообщение от vortexx1 Посмотреть сообщение
Хм, ForEveR, может, что-то вроде этого как раз и нужно. Как оно по-научному называется, чтоб можно было погуглить и почитать?
между делом, так. сегодня как раз пришлось разгребать кучу, которую наворотил один внешний сотрудник лет 5 назад. он любил templstes больше жизни. понять, как эта кухня работает, не может даже он (имею доказательство: как-то, когда очередной раз "горело", позвали. пришел, два часа пялился в код, извинился и ушел).
я угрохал сегодня целый день, чтобы сделать простейшую вещь. как оно все функционирует - был, есть и буду без понятия. дерьмо последнее. до рыгачки доводит разбираться. посему - никакой гарантии, что я сделал лучше, а не хуже - дать не могу.
гугли, читай. может, тоже в крутые попадешь.
0
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 01:46  [ТС] 10
И да, специально обученному идиоту вроде ничего не должно помешать сделать
C++
1
someFunc( (SomeClass::SomeEnum)43 );
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 01:47 11
Крутые сразу пишут на Хаскелле и смотрят на ваши темплейты как на брейнфак.

Называется это non-type template parameters. Всё замечательно, но так нельзя передавать переменные и объекты, только обычные, буквально записываемые константы.
1
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 01:51  [ТС] 12
novi4ok, спасибо. Поучительно.

Добавлено через 2 минуты
~OhMyGodSoLong~, не упоминай Господа всуе.
Время Хаскелла еще не настало.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.08.2012, 02:28 13
novi4ok, А это смотря как человек использует шаблоны, да. Любой возможностью плюсов можно выстрелить себе в ногу. Тот же буст состоит из шаблонов чуть более, чем полностью и прекрасно функционирует. А так же локи и прочие либы такого уровня.
1
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 11:38  [ТС] 14
В общем, решил использовать throw-catch-конструкции, всем спасибо.

Добавлено через 7 минут
Кстати, такой еще вопрос:

C++
1
2
3
4
5
6
7
8
9
#include <deque>
 
class SomeClass {
public:
    SomeClass();
    void shuffle();
private:
    deque< int > d;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "SomeClass.h"
#include <algorithm>
/* 
     правильно ли я поступил,
     включив algorithm в этом файле?
     Или его надо было подключить еще в заголовочном?
*/
 
SomeClass::SomeClass() {}
void SomeClass::shuffle() {
    // do something
}
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
25.08.2012, 12:11 15
Цитата Сообщение от ForEveR Посмотреть сообщение
novi4ok, А это смотря как человек использует шаблоны, да. Любой возможностью плюсов можно выстрелить себе в ногу. Тот же буст состоит из шаблонов чуть более, чем полностью и прекрасно функционирует. А так же локи и прочие либы такого уровня.
я не против шаблонов как явление. я против попытки каждую одноразовую проблему решать с их помощью, тулить их где только возможно. шаблоны хороши, когда:
- можно довольно просто понять, как ими пользоваться.
- они могут использоваться для широкого класса задач, а не только для А и Б
- они один раз отлажены, вылизаны, и никогда (!) не придется там что-то менять.
- их использование один раз не должно вынуждать тянуть в приложение туеву хучу каких-то неизвестных кусков чего-то.
0
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 12:32  [ТС] 16
Ребятки, это уже схватка на мечах шаблонах.
Ответьте на вопрос выше, пожалуйста.
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 12:37 17
Да никакой разницы чисто технически. Но так лучше инклудить там, где оно надо. Если используются исключительно в *.cpp — инклудить только в *.cpp.
1
6 / 6 / 3
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 17:27  [ТС] 18
Ну да, я имел ввиду вопрос именно со стороны хорошего тона.

Добавлено через 3 часа 57 минут
Еще такой вопрос об исключениях:
C++
1
2
3
4
void SomeClass::someFunc( int k ) {
    if( k >= 0 ) throw SomeError();
    k = -4; /* если исключение таки сработает, эта строка будет выполнена? */
}
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
25.08.2012, 17:47 19
Цитата Сообщение от vortexx1 Посмотреть сообщение
если исключение таки сработает, эта строка будет выполнена?
Нет
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
#include <iostream>
#include <memory>
 
struct Foo
{
    Foo()
    {
        std::cout << " Foo()" << ' ' << this << std::endl;
    }
    ~Foo()
    {
        std::cout << "~Foo()" << ' ' << this << std::endl;
    }
};
 
void foo()
{
    Foo* ptr1 = new Foo();
    std::shared_ptr<Foo> ptr2(new Foo());
    throw 42;
    std::cout << "Never" << std::endl;
    delete ptr1;
};
 
int main()
{
    try
    {
        foo();
    }
    catch(const int&)
    {
 
    }
    return 0;
}
1
25.08.2012, 17:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2012, 17:47
Помогаю со студенческими работами здесь

какие из этих имен встречаются во всех классах данной параллели которые есть только в некоторых классах и какие из этих имен не встречаются ни в одном
Помогите написать программу: заданы имена девочек определить какие из этих имен встречаются во всех...

Ошибка в классах
Подскажите что нужно сделать, что бы конструктор видел класс Cex(Цех) Перепишите текст программы и...

Видимость в классах
Убунту, стоит Code::Blocks IDE, стандартные настройки. Есть два класса, первый template &lt;...

константы в классах
в классе используется константа типа double. Как правильно задать ее? как static const double...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru