Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 15.10.2022
Сообщений: 31

Как обработать ошибку в конструкторе без исключений?

14.12.2022, 23:37. Показов 1522. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У нас есть класс в конструкторе которого может возникнуть ошибка. Как её вернуть данные об ошибке без исключений, если конструкторы не могут вернуть значение? Приводите пример кода, пожалуйста.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.12.2022, 23:37
Ответы с готовыми решениями:

Обход директорий: как обработать ошибку открытия папки без выхода из цикла?
обхожу директорию. for(recursive_directory_iterator recit(p);recit!=recursive_directory_iterator();recit++) { ... } ...

Как сделать без исключений
Нужно переписать функцию что бы выдовала ошибку без участия исключений. ( как делали до исключений) void __fastcall...

fs как обработать ошибку?
Как обработать ошибку в fs когда у программы нет прав администратора для какого-либо действия. То есть если возникла ошибка , то сделать...

9
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
15.12.2022, 07:59
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <errno.h>
 
class Foo {
public:
    Foo(int n, int* error) {
        if (n > 42)
            *error = ERANGE;
    }
};
 
int main()
{
    int error = 0;
    Foo f1{42, &error};
    std::cout << "f1 = " << error << "\n";
    error = 0;
    Foo f2{43, &error};
    std::cout << "f2 = " << error << "\n";
}
0
0 / 0 / 0
Регистрация: 15.10.2022
Сообщений: 31
15.12.2022, 17:19  [ТС]
GbaLog-, а можно ли сделать переменную в классе? Например: Errortype a. И если удачно создается объект, то делаем так: a = SUCCESS, а если ошибка, то a = ERROR или другой тип ошибки. Но тратится больше памяти, ведь на каждый объект создается Errortype переменная. В чем плюсы и минусы такого способа?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
15.12.2022, 17:29
Цитата Сообщение от Dimas103 Посмотреть сообщение
ак её вернуть данные об ошибке без исключений, если конструкторы не могут вернуть значение?
1) можно вынести проверку в фабричный метод (т.е. выполнять все проверки до вызова конструктора);
2) можно вынести всю инициализацию в отдельный метод init() и проверять его вовзращаемое значение.
0
0 / 0 / 0
Регистрация: 15.10.2022
Сообщений: 31
15.12.2022, 20:04  [ТС]
DrOffset, мне не нравится версия с фабричным методом, ведь там нужно делать динамическую инициализацию. А с init() не очень, ведь хочется сразу в конструкторе инициализировать члены класса, а не с init(). Давайте приведу пример. У нас есть игра, где человек может создать куб с помощью класса Cube(в конструкторе указываются параметры и 3 координаты), я хочу сделать, чтобы если эти координаты выше максимальных координат, указанных в константах maxCoordsX, Y, Z, то возвращалась ошибка из enum Error с названием MAX_COORDS_ERROR. Возможно немного странный способ, но просто хочеться узнать тонкости языка в конкретных ситуациях. Как это сделать? Повторюсь, что исключения не подходят.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
15.12.2022, 20:21
Цитата Сообщение от Dimas103 Посмотреть сообщение
ведь там нужно делать динамическую инициализацию.
Нет, не обязательно.

Цитата Сообщение от Dimas103 Посмотреть сообщение
А с init() не очень, ведь хочется сразу в конструкторе инициализировать члены класса, а не с init().
Взаимоисключающее, к сожалению, с вашими вводными условиями об отсутствии исключений.

Добавлено через 6 минут
Цитата Сообщение от Dimas103 Посмотреть сообщение
просто хочеться узнать тонкости языка в конкретных ситуациях
Идеологически неверно оставлять объект в недоинициализированном состоянии. Т.е. если есть конструктор, то он либо должен завершиться инициализацией корректного состояния объекта, либо выйти с исключением. Т.е. с этой точки зрения даже метод init() - это "не тру".

Да, можно сделать состояние ошибки частью корректного состояния объекта (вы это предложили сами выше), но это неоднозначное решение, в некоторых случаях оно уместно (например, если это класс результата SQL запроса - его объект в двух состояниях может быть - в режиме результата и в режиме ошибки ), но чаще всего, если у вас нет корректных данных для создания объекта, то этот объект вовсе не должен создаваться. Вот такая тонкость.
0
0 / 0 / 0
Регистрация: 15.10.2022
Сообщений: 31
15.12.2022, 20:45  [ТС]
DrOffset, можете привести пример фабрики без динамической инициализации? Буду признателен
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
15.12.2022, 21:01
Цитата Сообщение от Dimas103 Посмотреть сообщение
пример фабрики
Фабричный метод - это не фабрика все-таки. Но я приведу.

Возьму пример GbaLog- за основу. Надеюсь он не будет против.
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
#include <iostream>
#include <optional>
 
class Foo {
public:
    static std::optional<Foo> construct(int n) {
        if(n > 42) {
            return std::nullopt;
        }
        return Foo{n};
    }
 
    int getN() const {
        return m_n;
    }
 
private: 
    Foo(int n) : m_n(n) // конструктор приватный
    {}
 
private:
    int m_n;
};
 
int main()
{
    auto f1 = Foo::construct(42);
    if(!f1) {
        std::cout << "error\n";
    } 
    else {
        Foo& obj = *f1;
        std::cout << "N " << obj.getN() << '\n';
    }
        
    auto f2 = Foo::construct(43);
    if(!f2) {
        std::cout << "error\n";
    }
    else {
        Foo& obj = *f2;
        std::cout << "N " << obj.getN() << '\n';
    }    
}
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
16.12.2022, 01:57
Цитата Сообщение от Dimas103 Посмотреть сообщение
У нас есть класс в конструкторе которого может возникнуть ошибка. Как её вернуть данные об ошибке без исключений, если конструкторы не могут вернуть значение? Приводите пример кода, пожалуйста.

классика жанра - дизайн std::fstream

https://rextester.com/XKV38960

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
#include <iostream>
#include <fstream>
#include <string>
 
int main()
{
    const std::string filename = "test.bin";
    std::fstream s { filename, s.binary | s.trunc | s.in | s.out };
 
    if (!s)
        std::cout << "failed to open: '" << filename << "'\n";
    else
    {
        // write
        double d = 3.14;
        s.write(reinterpret_cast<char*>(&d), sizeof d); // binary output
        s << 123 << "abc";                              // text output
 
        // for fstream, this moves the file position pointer (both put and get)
        s.seekp(0);
 
        // read
        d = 2.71828;
        s.read(reinterpret_cast<char*>(&d), sizeof d); // binary input
        int n;
        std::string str;
        if (s >> n >> str)                             // text input
            std::cout << "read back from file: " << d << ' ' << n << ' ' << str << '\n';
    }
}
суть идеи в том, что у класса есть перегруженный оператор bool
который возвращает true, если с объектом все в порядке,
и false, если объект находится в нерабочем состоянии.


тот же самый дизайн используется, например, смартпоинтерами

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <memory>
 
void report(std::shared_ptr<int> ptr) 
{
    if (ptr)
        std::cout << "*ptr=" << *ptr << '\n';
    else
        std::cout << "ptr is not a valid pointer.\n";
}
 
int main()
{
    std::shared_ptr<int> ptr;
    report(ptr);
 
    ptr = std::make_shared<int>(7);
    report(ptr);
}

в твоем случае тоже можно сделать что-то вроде:

C++
1
2
3
4
5
6
sample obj { param };
if(!obj)
{
  std::cout << "ошибка инициализации\n"; 
  return 1;
}
0
0 / 0 / 0
Регистрация: 15.10.2022
Сообщений: 31
16.12.2022, 11:36  [ТС]
hoggy, в классе fstream есть переменная bool, которая проверяется оператором !. Верно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.12.2022, 11:36
Помогаю со студенческими работами здесь

Как обработать ошибку
В общем если пользователь вводит не верный ник, Api возвращает. { &quot;error&quot;: &quot;Player Not Found&quot; } Мне нужно что бы...

Как вызвать конструктор с параметрами в конструкторе без параметров?
Как вызвать конструктор с параметрами в конструкторе без параметров? То есть что бы конструктор с параметрами выступал в роли основного. В...

Как обработать ошибку Division by zero in?
Добрый день. Имею в плагине такой код public function getProgress($userId = null) { if ($userId === null) { ...

Как обработать такую ошибку?
Здравствуйте. Есть такой код. Если в ответе с сайта нет значения name тогда выскакивает ошибка. Как правильно её обработать что бы не...

Как правильно обработать ошибку?
здравствуйте, есть такая проблема. есть три таблицы и одним кликам делается запрос, проблема в том что не знаю как обработать ошибку ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru