Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 21.10.2021
Сообщений: 19

Обработчик исключительной ситуации

18.11.2021, 19:12. Показов 2012. Ответов 24

Студворк — интернет-сервис помощи студентам
Задание: Определить обработчик исключительной ситуации, если количество созданных объектов класса А превышает заданное значение.
Не знаю как решить, может кто то может сделать
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2021, 19:12
Ответы с готовыми решениями:

Определить обработчик исключительной ситуации, возникающей при попытке чтения элемента с пустой очереди
Помогите пожалуйста сделать это задание. Я не особо понял что тут нужно написать. Тема, которую мы проходим Исключительные ситуации. ...

Возбуждение исключительной ситуации
Помогите плз сгенерировать исключение. Требуется создать функцию, которая заполняет массив и возвращает true если это сделать удается,...

Обработка исключительной ситуации с файлом
нужно сделать обработку исключительной ситуации- невозможность открыть файл. здесь на try выплывает необработанное исключение. fstream...

24
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
26.11.2021, 00:19
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от sdf45 Посмотреть сообщение
Да, using namespace std там есть
да,
Плюс копипаст с форума у меня удалял некоторые символы.

Цитата Сообщение от sdf45 Посмотреть сообщение
что надо в std::exeption заворачивать при throw и разворачивать в catch
это не обязательно, всего то нужно явно создать возвращаемый объект.
вместо :
Цитата Сообщение от sdf45 Посмотреть сообщение
throw ("Created more than 3 class objects for: "+name);
C++
1
 throw string("Created more than 3 class objects for: "+name);
Почему так ? Поработаете с шаблонами - узнаете.

Добавлено через 39 секунд
+ name ))))))
0
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
26.11.2021, 01:27
SmallEvil, ясно, спасибо, буду знать на будущее
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.11.2021, 05:50
Цитата Сообщение от sdf45 Посмотреть сообщение
а так уже понял
что надо в std::exeption заворачивать
верно.

Цитата Сообщение от sdf45 Посмотреть сообщение
ясно, спасибо, буду знать на будущее
он херню пишет.

во-первых, технически, в этой строке нет никакой ошибки:
Цитата Сообщение от sdf45 Посмотреть сообщение
throw ("Created more than 3 class objects for: "+name);
во-вторых, так:
Цитата Сообщение от SmallEvil Посмотреть сообщение
throw string
только балбесы делают.

всегда кидай только и только наследников std::exeption


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


например:
есть библиотека управления самолетом.
сначала запускаем двигатели.
а затем - летим:

C++
1
2
3
4
5
6
7
8
#include <самолет.hpp>
 
int main()
{
  Самолет самолет;
  самолет.запуск_двигателей();
  самолет.лети();
}
но если вдруг какие то проблемы будут с двигателем,
самолет должен остаться на земле.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <самолет.hpp>
 
int main()
{
  Самолет самолет;
  try{
    самолет.запуск_двигателей();
  }
  catch(const std::exception& e)
  {
    std::cerr << e.what() << std::endl;
    return EXIT_FAILURE;
  }
  самолет.лети();
}
обрати внимание: самолет - чужая разработка.
мы понятия не имеем, что там может пойти не так с двигателями.
и тем не менее, это никак не мешает нам вывести в лог диагностику неполадки,
и реализовать сценарий аварийного поведения.

это возможно лишь благодаря тому, что мы знаем:
что бы ни вылетело из метода самолет.запуск_двигателей(),
оно будет наследником std::exception,
а значит, мы всегда можем заполучить человеко-читабельный e.what(),
и адекватно отреагировать на неудачу запускаемой нами функции.

аналогичным образом можно реализовывать обработку нештатных ситуаций для любых библиотек,
для любого стороннего API, без необходимости вникать в детали реализации этого самого API.

это очень важный момент.
я ещё раз подчеркну мысль:
можно писать безопасный код не зная,
и не вникая в детали реализации запускаемых функций.

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


но если бы разработчики начали кидать всякий произвольный хлам,
тогда у нас уже не было бы возможности его так просто отловить.

можно, конечно, использовать ловушку-элипсис:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <самолет.hpp>
 
int main()
{
  Самолет самолет;
  try{
    самолет.запуск_двигателей();
  }
  catch(const std::exception& e)
  {
    std::cerr << e.what() << std::endl;
    return EXIT_FAILURE;
  }
  catch(...) // <-- ловит эксепшены любого типа
  {
    std::cerr << "unknown error" << std::endl;
    return EXIT_FAILURE;
  }
 
  самолет.лети();
}
но во-первых, в этом случае мы теряем человеко-читабельную диагностику.

а во-вторых, и это очень очень очень плохо:
в ловушку-элипсис может залетать seh-эксепшен

грубо говоря, seh срабатывает в том случае,
когда приложение заглючило, и оно словило access violation,
или что-то подобное.
и если приложение отвечает за финансы или здоровье людей,
то такое приложение опасно оставлять в живых.
потому что нестабильный процесс может наломать дров.

и вот что бы понять, что происходит:
исключительная ситуация, или полный треш?
для этого необходимо четко разграничивать:
адекватные исключения попадают в ловушку std::exception
а seh, соотвественно, в ловушку с тремя точками.

итого:
всегда кидай только и только наследников std::exception,
что бы можно было изготавливать универсальные ловушки,
с человеко-читабельной диагностикой.

никогда не кидай всякий хлам,
который улетит в ловушку-троеточие,
где уже нельзя ни прочитать текст диагностики,
ни даже просто отличить от аварийных сигналов ОС.
2
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
26.11.2021, 06:58
Цитата Сообщение от hoggy Посмотреть сообщение
а можно ли убрать из кода мьютекс ?
На березовых бруньках атомиках?
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
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <atomic>
#include <vector>
#include <mutex>
#include <thread>
 
class A {
public:
    A() {
        long int result = instance_counter.fetch_add(1, std::memory_order_release);
 
        if (result > maximum_instances) {
            instance_counter.fetch_sub(1, std::memory_order_release);
            throw std::logic_error("that's too much!");
        }
    }
    virtual ~A() {
        instance_counter.fetch_sub(1);
    }
private:
    static std::atomic<long int> instance_counter;
    static long int maximum_instances;
};
 
std::atomic<long int> A::instance_counter = 0L;
long int A::maximum_instances = 1000L;
 
int main() {
 
    std::vector<A*> instances;
 
    auto executor = [&](){
        for (int i = 0; i < 200; ++i) {
            try {
                A *instance = new A();
                instances.push_back(instance);
            } catch (std::logic_error &e) {
                std::cout << e.what() << std::endl;
            }
        }
    };
 
    std::vector<std::thread> threads;
    for (std::size_t i = 0; i < 10; ++i) {
        threads.emplace_back(executor);
    }
 
    for (auto &thread :threads) {
        thread.join();
    }
    std::cout << "TOTALLY CREATED " << instances.size() << " INSTANCES" << std::endl;
 
    for (auto *instance : instances) {
        delete instance;
    }
    return 0;
}
Почему-то создаётся на один инстанс больше положенного, не стал разбираться в семь утра.
1
Покинул чат.
1133 / 728 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
26.11.2021, 13:21
hoggy, спасибо Вам большое за пояснения
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.11.2021, 13:21

Обработка исключительной ситуации переполнения вещественного числа
Помогите написать программу, которая выполняет обработку исключительной ситуации переполнения вещественного числа, я в целов поняла, что...

Изменение окна сообщения для исключительной ситуации
В программе есть контролируемая исключительная ситуация. Мне надо програмно изменить надпись вверху. Сейчас эта надпись берётся из...

Обработка исключительной ситуации для пробела в названии файла
int main() { ifstream ifs1, ifs2; ofstream ofs3; ofs3.exceptions(ofstream::badbit | ofstream::failbit ); try ...

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ...
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

Создать свой собственный обработчик исключительной ситуации для ошибки преобразования типов
помогите пожалуйста! нужно создать свой собственный обработчик исключительной ситуации (блок) для ошибки преобразования типов. При этом...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru