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

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

Восстановить пароль Регистрация
 
 
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 772
Завершенные тесты: 1
01.12.2015, 11:03     Когда нужно использовать исключения #1
Когда, по вашему, лучше использовать исключения?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kerry_Jr
Модератор
 Аватар для Kerry_Jr
1855 / 1651 / 574
Регистрация: 14.05.2014
Сообщений: 4,726
Записей в блоге: 1
Завершенные тесты: 5
01.12.2015, 11:07     Когда нужно использовать исключения #2
Knjagskij, в эту тему загляните. Там это же обсуждается.
Operok
125 / 123 / 33
Регистрация: 15.02.2015
Сообщений: 386
Завершенные тесты: 2
01.12.2015, 11:24     Когда нужно использовать исключения #3
Ловить исключения или бросать?
Ловить стоит везде где они могут быть брошены. Какие исключения бросают те или иные функции должно быть задокументировано. Необработанное исключение - падение программы.
Бросание исключений это как сообщить другому программисту, использующему ваш код (библиотеку, например), об ошибке, как поступать с этой ошибкой решать ему, ваша задача, как можно более подробно описать её (либо задокументировать, либо передать всю нужную информацию в сообщении этого исключения). Бросать исключения в коде уже самого приложения, нет смысла, вам же его и ловить придётся.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,222
01.12.2015, 11:29     Когда нужно использовать исключения #4
Цитата Сообщение от Operok Посмотреть сообщение
Бросать исключения в коде уже самого приложения, нет смысла
затрите пока никто не видел, а то портит пост
Operok
125 / 123 / 33
Регистрация: 15.02.2015
Сообщений: 386
Завершенные тесты: 2
01.12.2015, 11:57     Когда нужно использовать исключения #5

Не по теме:

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


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

Почему еще это неудобно — конструктор вообще ничего не возвращает.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.12.2015, 16:06     Когда нужно использовать исключения #9
Knjagskij, ну, навскидку: 1) придётся на всех уровнях вложенности вызовов проверять коды ошибок и в случае неудачи пробрасывать код наверх, в место, где нужно обработать ошибку; 2) код ошибки не несёт дополнительной информации. Не открылся файл? Отлично. А какой файл? Конфиг? Или лог? Или какой-нибудь временный файл? Не будете же вы на эти три однородных ошибки 3 кода заводить.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
01.12.2015, 16:08     Когда нужно использовать исключения #10
Цитата Сообщение от silent_1991 Посмотреть сообщение
Не открылся файл? Отлично. А какой файл?
Тот, который только что пытались открыть)
Operok
125 / 123 / 33
Регистрация: 15.02.2015
Сообщений: 386
Завершенные тесты: 2
01.12.2015, 16:08     Когда нужно использовать исключения #11
Цитата Сообщение от Knjagskij Посмотреть сообщение
А просто передавать некое число на выходе функции, которое в себе несет код ошибки чем не удобно?
Такой подход используют многие библиотеки. Без такого подхода никак в программировании COM и динамических библиотек (HRESULT), так как передать исключение в таких случаях не представляется возможным.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.12.2015, 16:13     Когда нужно использовать исключения #12
Цитата Сообщение от 0x10 Посмотреть сообщение
Тот, который только что пытались открыть)
Как мы узнаем, какой файл мы пытались открыть, если между местом возникновения ошибки и местом её обработки лежит 5 фреймов стека?)) Потому и написал, что обычно extra-data полезнее, чем сам тип ошибки.
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 772
Завершенные тесты: 1
01.12.2015, 17:17  [ТС]     Когда нужно использовать исключения #13
Мы можем структуру на выходе выдавать.
Цитата Сообщение от silent_1991 Посмотреть сообщение
Knjagskij, ну, навскидку: 1) придётся на всех уровнях вложенности вызовов проверять коды ошибок и в случае неудачи пробрасывать код наверх, в место, где нужно обработать ошибку; 2) код ошибки не несёт дополнительной информации. Не открылся файл? Отлично. А какой файл? Конфиг? Или лог? Или какой-нибудь временный файл? Не будете же вы на эти три однородных ошибки 3 кода заводить.
А как нам поможет исключение в этом случае, там же тоже названию сопоставляется обработчик.
Не разобрался, чем пара (throw, catch) отличается от (return, swich(if))?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.12.2015, 17:21     Когда нужно использовать исключения #14
Цитата Сообщение от Knjagskij Посмотреть сообщение
А как нам поможет исключение в этом случае
В каком из двух?)
В первом случае, нам ничего вручную пробрасывать не придётся, исключение поймается там, где будет соответствующий обработчик, хоть в функции main.
Во втором случае, объект исключения может нести дополнительную информацию, в приведённом случае, например, имя файла, который не удалось открыть, и причину, по которой это не удалось сделать (эту причину должна каким-либо образом вернуть функция открытия файла, это может быть код ошибки или, например, другой объект-исключение).
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
01.12.2015, 17:22     Когда нужно использовать исключения #15
Цитата Сообщение от Knjagskij Посмотреть сообщение
Мы можем структуру на выходе выдавать.
Можно. Еще через пару итераций придешь к мысли, что можно возвращать сумму типов: variant<Result, Error>.
Цитата Сообщение от Knjagskij Посмотреть сообщение
А как нам поможет исключение в этом случае, там же тоже названию сопоставляется обработчик.
1. Кидают, как правило, осмысленные структуры с различимыми типами и информацией об ошибке.
2. Во время генерации исключения происходит раскрутка стека, что позволяет выбрать на каком уровне разумно обработать исключение, а не вручную пробрасывать код ошибки/структуру через все уровни.
3. Исключения помогают разделить код бизнес-логики и код обработки ошибок. В блоке try — логика, в блоках catch — обработка исключений. В случае кодов возврата нужно после каждого вызова писать код проверок.
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 772
Завершенные тесты: 1
01.12.2015, 17:25  [ТС]     Когда нужно использовать исключения #16
А если у нас два потока и один бросает исключение, то мы можем поймать его в другом?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.12.2015, 17:26     Когда нужно использовать исключения #17
Цитата Сообщение от 0x10 Посмотреть сообщение
Еще через пару итераций придешь к мысли, что можно возвращать сумму типов: variant<Result, Error>.
И, в общем-то, будет не далёк от истины) Тоже вполне себе подход к обработке ошибок, и много где используется по умолчанию.
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 772
Завершенные тесты: 1
01.12.2015, 17:26  [ТС]     Когда нужно использовать исключения #18
Честно говоря, все-равно до конца не понял, можете привести какой-нибудь пример, где исключениями пользоваться проще, чем if-ми?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.12.2015, 17:43     Когда нужно использовать исключения #19
Цитата Сообщение от Knjagskij Посмотреть сообщение
А если у нас два потока и один бросает исключение, то мы можем поймать его в другом?
Нет, исключения нужно обязательно поймать где-то в потоке, в котором оно возникло, если оно выйдет из точки входа потока, вызовется std::terminate.

Добавлено через 4 минуты
Сейчас накидаю вам пример.

Добавлено через 8 минут
Простенький пример.
С исключениями: http://ideone.com/1awEGD
Без исключений: http://ideone.com/ddJv4s
Тут всего один уровень вложенности (функция handlefiles вызывает проблемную функцию openfile). А представьте, если проблемных функций много, все могут вернуть разные ошибки, и много уровней вложенности, а нам надо ошибку обработать далеко от места её возникновения? Куча if'ов, возвраты кодов ошибок, которые функция по логике возвращать не должна (где-то в недрах не открылся файл, о котором пользователь и знать не должен, а ему из интерфейсной функции летит такой код ошибки).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2015, 16:10     Когда нужно использовать исключения
Еще ссылки по теме:

Пишем исключения для каждого типа данных, или можно использовать шаблон? C++
C++ Нужно на основе ранее созданных массивов A и B создать массив С правилом исключения
Когда использовать WinAPI, а когда функции языка? C++

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

Или воспользуйтесь поиском по форуму:
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 772
Завершенные тесты: 1
02.12.2015, 16:10  [ТС]     Когда нужно использовать исключения #20
Отдельное спасибо, за
C++
1
code = openfile("/home/Knjagskij/file1.txt");
)))
А мы обязательно должны передавать в исключении объект? И число 10 - это просто параметр для примера, или в нем есть какой-то смысл?
C++
1
throw OpenFileException(name, 10);
Кстати, в ООП, как я понял, я является признаком хорошего тона возвращать значения атрибутов через методы? Или не обязательно, ведь, одно дело, если мы присваиваем им значения и их нужно проверять, а другое, если мы ничем не рискуем (при присвоении значения чему-либо из атрибута этого класса)
Yandex
Объявления
02.12.2015, 16:10     Когда нужно использовать исключения
Ответ Создать тему
Опции темы

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