Как бросить своё исключение?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):Так две, или куча? Судя по тому, как Вы путаетесь в числах, не искали именно Вы. Или только сейчас поискали. Мне тоже вышла куча, но всей кучи не хватило.
Ты забавно выглядишь, когда начинаешь к словам придираться, причём трактуя их по-своему :)

Ссылок куча. Я взял из них две первые и объяснил, что в них можно прочитать. Так всё сходится? Никаких противоречий?

Достаточно перейти по первым двум, прочесть всё, осознать это и этого будет достаточно. Я очень сомневаюсь, что эти две темы всплыли в топ только сейчас и раньше были недоступны. Делаю предположение, что тебе было их просто лень читать, либо не получилось осознать то, что там написано.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Так в том то и дело, что перейти по ссылкам на первых двух десятках страниц не достаточно.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Оксалайя
Сообщения: 27
Зарегистрирован: 01 сен 2015, 12:12

Сионист писал(а):Так в том то и дело, что перейти по ссылкам на первых двух десятках страниц не достаточно.

Вы правы, нужно ещё напрячься, прочитать и осознать прочитанное. А не бежать на форум и просить, чтобы Вам всё разжевали.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Оксалайя писал(а):Вы правы, нужно ещё напрячься, прочитать и осознать прочитанное. А не бежать на форум и просить, чтобы Вам всё разжевали.
Прочитать тоже не достаточно. И даже пройти по ссылкам на тех страницах и прочитать страницы, на которые ведут уже эти ссылки. Потому что везде или throw без операндов и catch с тремя точками, или вообще общие слова, не имеющие отношения к c++.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Да глупость это. Вот первая ссылка ведет на MSDN, в котором в первом же примере функция кидает исключение разных типов и там же их ловят, выполняя разные блоки кода в зависимости от типа исключения.
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Эйси. А как создать и бросать своё? Ни слова, просто бросаются чёрные ящики в виде исключений и всё. Чем это лучше пустой пропаганды исключений вместо кодов возврата вообще без даже намёка на c++ код?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Бросать можно объект любого типа, от встроенного до объекта собственного класса. Никакого отличия при этом не будет. Все же остальные вещи, которые описаны в этой статье очень важны и актуальны. Например размотка стека.

В чём преимущество перед кодами возвратов.

1. Исключению можно дать осмысленное имя. С кодами возвратов это можно сделать только через #define, который между прочим ничего не гарантирует и не защищает от ошибок.

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

3. Исключения можно выстраивать в иерархии и где-то ловить конкретное исключение, а где-то, где это требуется, сразу целый набор исключений по базовому классу. С кодами возвратов такое сделать если и получится, то это будет настолько неочевидно и негибко, то чёрт ногу сломит.

4. Есть места, из которых просто невозможно вернуть код возврата. Пример - это конструктор. Его сингатура закреплена стандартом языка. Как сигнализировать об ошибке? Только бросив исключение.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Бросать можно объект любого типа, от встроенного до объекта собственного класса. Никакого отличия при этом не будет. Все же остальные вещи, которые описаны в этой статье очень важны и актуальны. Например размотка стека.

В чём преимущество перед кодами возвратов.

1. Исключению можно дать осмысленное имя. С кодами возвратов это можно сделать только через #define, который между прочим ничего не гарантирует и не защищает от ошибок.
Что то осмысленности "имён" исключений я как раз и не заметил. А коды возварата отлично обходятся без дефайнов. Ни nullptr, ни quiet_NaN, ни infinity, ни возврат структуры с енам-полем в дефайне вообще не нуждается, я даже не смогу прикрутить к ним дефайн. Но если функция A вызвала функцию B, та вызвала функцию C, а та функцию D, ошибка возникла в функции D и может быть адекватно обработана только в A, то с кодами возврата будет много проблем, а исключения этим не страдают.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):3. Исключения можно выстраивать в иерархии и где-то ловить конкретное исключение, а где-то, где это требуется, сразу целый набор исключений по базовому классу. С кодами возвратов такое сделать если и получится, то это будет настолько неочевидно и негибко, то чёрт ногу сломит.
Получится. Но очень громоздко. Я такие извращения не люблю.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить