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

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

Войти
Регистрация
Восстановить пароль
 
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 00:42     Исключения в классах #1
Здравствуйте.
Какими средствами правильней всего сделать обработку исключений в классах?

C++
1
2
3
4
5
6
7
/* например, эта функция */
int SomeClass::someFunc( int some_arg ) { return some_arg * 18 }
/*
  для нормальной работы
  должна получать числа от 0 до 42. 
  Как реагировать на остальное?
*/
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2012, 00:42     Исключения в классах
Посмотрите здесь:

C++ Ошибка в классах
C++ Наследование в классах
C++ наследование в классах
C++ Видимость в классах
C++ Векторы (в классах)
C++ Ошибка в классах
Ошибки в классах C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
25.08.2012, 00:58     Исключения в классах #2
вариантов много. зависит от того, как по концепции (желательно иметь в приложении) должны обрабатываться инвалидные аргументы. можно возвращать некий INVALID_INTEGER, можно бросать исключение (если оно где-то ловится), можно аварийно завершать приложение, занеся в протокол соотв. запись, можно ...
в общем, все, чего твоя фантазия пожелает.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 01:08  [ТС]     Исключения в классах #3
Спасибо.

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

Дело вот в чем: я вроде как разрабатываю набор классов, и было бы неплохо всякое неподобство разрешать наиболее общим и безболезненным методом.
Кстати, как-то можно выбрасывать ошибку еще при компиляции в случае "неподобства"?
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
25.08.2012, 01:13     Исключения в классах #4
vortexx1, Только для того, что вы можете проверить на этапе компиляции. В данной функции на этапе компиляции вы ничего проверить не можете.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1238 / 987 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 01:19     Исключения в классах #5
> 1. Как-то это некрасиво и в стиле C.
Это давний срач, что лучше: коды возврата или исключения. (И ассерты сверху.)

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

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

Конкретное решение больше зависит от того, кому нужна эта ошибка, когда она может произойти и насколько она фатальна. То есть кто обязан следить за тем, чтобы число находилось в пределах [0; 42]. Универсальный вариант: выкинуть исключение, а дальше это уже проблемы того, кто передаёт мусор в вашу функцию.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
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;
}
novi4ok
549 / 502 / 8
Регистрация: 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};
, и проблема решена. некрасиво, но как ты хочешь.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 01:41  [ТС]     Исключения в классах #8
Хм, ForEveR, может, что-то вроде этого как раз и нужно. Как оно по-научному называется, чтоб можно было погуглить и почитать?

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

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

Добавлено через 2 минуты
~OhMyGodSoLong~, не упоминай Господа всуе.
Время Хаскелла еще не настало.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
25.08.2012, 02:28     Исключения в классах #13
novi4ok, А это смотря как человек использует шаблоны, да. Любой возможностью плюсов можно выстрелить себе в ногу. Тот же буст состоит из шаблонов чуть более, чем полностью и прекрасно функционирует. А так же локи и прочие либы такого уровня.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 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
}
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
25.08.2012, 12:11     Исключения в классах #15
Цитата Сообщение от ForEveR Посмотреть сообщение
novi4ok, А это смотря как человек использует шаблоны, да. Любой возможностью плюсов можно выстрелить себе в ногу. Тот же буст состоит из шаблонов чуть более, чем полностью и прекрасно функционирует. А так же локи и прочие либы такого уровня.
я не против шаблонов как явление. я против попытки каждую одноразовую проблему решать с их помощью, тулить их где только возможно. шаблоны хороши, когда:
- можно довольно просто понять, как ими пользоваться.
- они могут использоваться для широкого класса задач, а не только для А и Б
- они один раз отлажены, вылизаны, и никогда (!) не придется там что-то менять.
- их использование один раз не должно вынуждать тянуть в приложение туеву хучу каких-то неизвестных кусков чего-то.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 12:32  [ТС]     Исключения в классах #16
Ребятки, это уже схватка на мечах шаблонах.
Ответьте на вопрос выше, пожалуйста.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1238 / 987 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 12:37     Исключения в классах #17
Да никакой разницы чисто технически. Но так лучше инклудить там, где оно надо. Если используются исключительно в *.cpp — инклудить только в *.cpp.
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 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; /* если исключение таки сработает, эта строка будет выполнена? */
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2012, 17:47     Исключения в классах
Еще ссылки по теме:

C++ Функции в классах С++
Подробнее о классах C++
C++ Ошибка в классах
C++ Fstream в классах
C++ Шаблоны в классах C++

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

Или воспользуйтесь поиском по форуму:
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 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;
}
Yandex
Объявления
25.08.2012, 17:47     Исключения в классах
Ответ Создать тему
Опции темы

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