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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
#1

Когда нужно использовать исключения - C++

01.12.2015, 11:03. Просмотров 658. Ответов 21
Метки нет (Все метки)

Когда, по вашему, лучше использовать исключения?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.12.2015, 11:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Когда нужно использовать исключения (C++):

Когда нужно использовать &ссылки ,а когда *указатели? - C++
Желательно с примерами

Объяснить (с примерами) для чего нужен RTTI, как и когда его можно и нужно использовать - C++
доброго времени суток. вопрос такой как я понял RTTI это свойсвто языка С++ которое было добавлено позднее его релиза, что бы...

Когда стоит использовать класс, а когда лучше обойтись без них? - C++
Когда стоит использовать класс, а когда лучше обойтись без них? Когда следует использовать несколько классов? Вот, например. Программа...

Когда надо использовать списки инициализации, а когда можно заменить их констуктором по умолчанию? - C++
1)Любезные,скажите когда надо исп. списки инициализации, а когда можно заменить констуктором по умолчанию? 2) правильно ли...

Когда использовать WinAPI, а когда функции языка? - C++
Не совсем понимаю, когда нужно использовать WinAPI в приложении, а когда функционал самого ЯП (С/С++). Для той же работы с файлами...

Работает ли указатель на базовый класс исключения, когда попадает в блок catch - C++
Работает ли указатель на базовый класс исключения, когда попадает в блок catch так же как обычно? То есть, если есть переопределенные...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kerry_Jr
Модератор
Эксперт PHP
2185 / 1981 / 692
Регистрация: 14.05.2014
Сообщений: 5,791
Записей в блоге: 1
Завершенные тесты: 5
01.12.2015, 11:07 #2
Knjagskij, в эту тему загляните. Там это же обсуждается.
Operok
149 / 147 / 42
Регистрация: 15.02.2015
Сообщений: 427
Завершенные тесты: 2
01.12.2015, 11:24 #3
Ловить исключения или бросать?
Ловить стоит везде где они могут быть брошены. Какие исключения бросают те или иные функции должно быть задокументировано. Необработанное исключение - падение программы.
Бросание исключений это как сообщить другому программисту, использующему ваш код (библиотеку, например), об ошибке, как поступать с этой ошибкой решать ему, ваша задача, как можно более подробно описать её (либо задокументировать, либо передать всю нужную информацию в сообщении этого исключения). Бросать исключения в коде уже самого приложения, нет смысла, вам же его и ловить придётся.
rikimaru2013
C++ Game Dev
2429 / 1123 / 240
Регистрация: 30.11.2013
Сообщений: 3,673
01.12.2015, 11:29 #4
Цитата Сообщение от Operok Посмотреть сообщение
Бросать исключения в коде уже самого приложения, нет смысла
затрите пока никто не видел, а то портит пост
Operok
149 / 147 / 42
Регистрация: 15.02.2015
Сообщений: 427
Завершенные тесты: 2
01.12.2015, 11:57 #5

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
затрите
поздно


Я наверное не так выразился. Нет смысла кидать исключения в коде, который не будет использоваться в других приложениях. Например, обработка параметров функции main, даже если для этого написал небольшой класс, достаточно вывести сообщение пользователю. Т.е. я либо ловлю исключения и сообщаю при необходимости пользователю (текст в консоли или message box), либо при возникновении исключительной ситуации уже обрабатываю её (не бросая исключения), при необходимости сообщая что-нибудь пользователю.
Ilot
Модератор
Эксперт С++
1809 / 1166 / 226
Регистрация: 16.05.2013
Сообщений: 3,070
Записей в блоге: 5
Завершенные тесты: 1
01.12.2015, 12:06 #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Knjagskij Посмотреть сообщение
Когда, по вашему, лучше использовать исключения?
Исключения используются там где затруднено сообщить о возникновении ошибки. Как то конструкторы, сложные методы и функции и т.д.
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
01.12.2015, 16:01  [ТС] #7
А просто передавать некое число на выходе функции, которое в себе несет код ошибки чем не удобно?
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
01.12.2015, 16:05 #8
Цитата Сообщение от Knjagskij Посмотреть сообщение
А просто передавать некое число на выходе функции, которое в себе несет код ошибки чем не удобно?
Такой подход предполагает, что где-то для каждого числа должна быть сопоставлена строка с человекопонятным описанием.
См похожее: errno, perror.
С той разницей, что errno — глобальная переменная.

Почему еще это неудобно — конструктор вообще ничего не возвращает.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2015, 16:06 #9
Knjagskij, ну, навскидку: 1) придётся на всех уровнях вложенности вызовов проверять коды ошибок и в случае неудачи пробрасывать код наверх, в место, где нужно обработать ошибку; 2) код ошибки не несёт дополнительной информации. Не открылся файл? Отлично. А какой файл? Конфиг? Или лог? Или какой-нибудь временный файл? Не будете же вы на эти три однородных ошибки 3 кода заводить.
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
01.12.2015, 16:08 #10
Цитата Сообщение от silent_1991 Посмотреть сообщение
Не открылся файл? Отлично. А какой файл?
Тот, который только что пытались открыть)
Operok
149 / 147 / 42
Регистрация: 15.02.2015
Сообщений: 427
Завершенные тесты: 2
01.12.2015, 16:08 #11
Цитата Сообщение от Knjagskij Посмотреть сообщение
А просто передавать некое число на выходе функции, которое в себе несет код ошибки чем не удобно?
Такой подход используют многие библиотеки. Без такого подхода никак в программировании COM и динамических библиотек (HRESULT), так как передать исключение в таких случаях не представляется возможным.
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2015, 16:13 #12
Цитата Сообщение от 0x10 Посмотреть сообщение
Тот, который только что пытались открыть)
Как мы узнаем, какой файл мы пытались открыть, если между местом возникновения ошибки и местом её обработки лежит 5 фреймов стека?)) Потому и написал, что обычно extra-data полезнее, чем сам тип ошибки.
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
01.12.2015, 17:17  [ТС] #13
Мы можем структуру на выходе выдавать.
Цитата Сообщение от silent_1991 Посмотреть сообщение
Knjagskij, ну, навскидку: 1) придётся на всех уровнях вложенности вызовов проверять коды ошибок и в случае неудачи пробрасывать код наверх, в место, где нужно обработать ошибку; 2) код ошибки не несёт дополнительной информации. Не открылся файл? Отлично. А какой файл? Конфиг? Или лог? Или какой-нибудь временный файл? Не будете же вы на эти три однородных ошибки 3 кода заводить.
А как нам поможет исключение в этом случае, там же тоже названию сопоставляется обработчик.
Не разобрался, чем пара (throw, catch) отличается от (return, swich(if))?
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2015, 17:21 #14
Цитата Сообщение от Knjagskij Посмотреть сообщение
А как нам поможет исключение в этом случае
В каком из двух?)
В первом случае, нам ничего вручную пробрасывать не придётся, исключение поймается там, где будет соответствующий обработчик, хоть в функции main.
Во втором случае, объект исключения может нести дополнительную информацию, в приведённом случае, например, имя файла, который не удалось открыть, и причину, по которой это не удалось сделать (эту причину должна каким-либо образом вернуть функция открытия файла, это может быть код ошибки или, например, другой объект-исключение).
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
01.12.2015, 17:22 #15
Цитата Сообщение от Knjagskij Посмотреть сообщение
Мы можем структуру на выходе выдавать.
Можно. Еще через пару итераций придешь к мысли, что можно возвращать сумму типов: variant<Result, Error>.
Цитата Сообщение от Knjagskij Посмотреть сообщение
А как нам поможет исключение в этом случае, там же тоже названию сопоставляется обработчик.
1. Кидают, как правило, осмысленные структуры с различимыми типами и информацией об ошибке.
2. Во время генерации исключения происходит раскрутка стека, что позволяет выбрать на каком уровне разумно обработать исключение, а не вручную пробрасывать код ошибки/структуру через все уровни.
3. Исключения помогают разделить код бизнес-логики и код обработки ошибок. В блоке try — логика, в блоках catch — обработка исключений. В случае кодов возврата нужно после каждого вызова писать код проверок.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2015, 17:22
Привет! Вот еще темы с ответами:

Пишем исключения для каждого типа данных, или можно использовать шаблон? - C++
Всем доброго дня. В классе &quot;очередь&quot; я использую шаблон класса и если пользователь захочет допустим ввести не тип int а тип double то мне...

Когда нужно/не нужно возвращать объект при перегрузке присваивания? - C++
Доброго времени суток! Перегрузка присваивания: class alpha { private: int data; public: alpha() // конструктор без...

Когда какой контейнер использовать? - C++
Поделитесь опытом, когда и при каких условиях какой контейнер особенно удобен? Только поменьше абстракции пожалуйста :)

Указатель this - как и когда его использовать - C++
Объясните, зачем нужен указатель this, как его применять в классах, если можно небольшой пример.


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.12.2015, 17:22
Ответ Создать тему
Опции темы

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