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

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

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

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

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

Когда, по вашему, лучше использовать исключения?
0
Лучшие ответы (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 так же как обычно? То есть, если есть переопределенные...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
01.12.2015, 17:25  [ТС] #16
А если у нас два потока и один бросает исключение, то мы можем поймать его в другом?
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2015, 17:26 #17
Цитата Сообщение от 0x10 Посмотреть сообщение
Еще через пару итераций придешь к мысли, что можно возвращать сумму типов: variant<Result, Error>.
И, в общем-то, будет не далёк от истины) Тоже вполне себе подход к обработке ошибок, и много где используется по умолчанию.
0
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
01.12.2015, 17:26  [ТС] #18
Честно говоря, все-равно до конца не понял, можете привести какой-нибудь пример, где исключениями пользоваться проще, чем if-ми?
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2015, 17:43 #19
Цитата Сообщение от Knjagskij Посмотреть сообщение
А если у нас два потока и один бросает исключение, то мы можем поймать его в другом?
Нет, исключения нужно обязательно поймать где-то в потоке, в котором оно возникло, если оно выйдет из точки входа потока, вызовется std::terminate.

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

Добавлено через 8 минут
Простенький пример.
С исключениями: http://ideone.com/1awEGD
Без исключений: http://ideone.com/ddJv4s
Тут всего один уровень вложенности (функция handlefiles вызывает проблемную функцию openfile). А представьте, если проблемных функций много, все могут вернуть разные ошибки, и много уровней вложенности, а нам надо ошибку обработать далеко от места её возникновения? Куча if'ов, возвраты кодов ошибок, которые функция по логике возвращать не должна (где-то в недрах не открылся файл, о котором пользователь и знать не должен, а ему из интерфейсной функции летит такой код ошибки).
2
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 774
Завершенные тесты: 1
02.12.2015, 16:10  [ТС] #20
Отдельное спасибо, за
C++
1
code = openfile("/home/Knjagskij/file1.txt");
)))
А мы обязательно должны передавать в исключении объект? И число 10 - это просто параметр для примера, или в нем есть какой-то смысл?
C++
1
throw OpenFileException(name, 10);
Кстати, в ООП, как я понял, я является признаком хорошего тона возвращать значения атрибутов через методы? Или не обязательно, ведь, одно дело, если мы присваиваем им значения и их нужно проверять, а другое, если мы ничем не рискуем (при присвоении значения чему-либо из атрибута этого класса)
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
02.12.2015, 16:20 #21
Цитата Сообщение от Knjagskij Посмотреть сообщение
А мы обязательно должны передавать в исключении объект?
Крайне желательно. Объект несет в себе больше информации, чем простой тип. И дело не в том, что в объекте можно сохранить больше данных, а в том, что объекты различимы по типу. В этом случае легко отделимы друг от друга исключения различных библиотек.

Если из библиотечного метода вылетает std::invalid_argument, возможно, это исключение не было предусмотрено автором.
Если же вылетает library_name::SpecificException, то, вероятно, исключение предусмотрено и его нужно обрабатывать не так, как безликий invalid_argument.
1
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
02.12.2015, 17:02 #22
Цитата Сообщение от Knjagskij Посмотреть сообщение
А мы обязательно должны передавать в исключении объект?
Нет, объектом исключения может быть объект любого типа, даже примитивного (int или const char *).
Цитата Сообщение от Knjagskij Посмотреть сообщение
число 10 - это просто параметр для примера, или в нем есть какой-то смысл?
Просто пример. Тот же код возврата, только переданный внутри объекта исключения.
Вообще, весь код - всего лишь крошечный пример. Функция openfile не возвращает ничего, связанного с, собственно, открытым файлом. Класс исключения не наследуется от std::exception и не переопределяет виртуальный метод what. Используются магические числа. Короче говоря, так писать не надо)

Цитата Сообщение от Knjagskij Посмотреть сообщение
Кстати, в ООП, как я понял, я является признаком хорошего тона возвращать значения атрибутов через методы? Или не обязательно, ведь, одно дело, если мы присваиваем им значения и их нужно проверять, а другое, если мы ничем не рискуем (при присвоении значения чему-либо из атрибута этого класса)
Тут есть несколько слоёв в понимании, почему надо работать с полями через интерфейсные методы доступа.
Первый слой: возможно, на значения, которое может принимать поле, накладываются некоторые ограничения. Тогда в сеттере нужно проверять, подходит ли устанавливаемое значение под эти ограничения. А, возможно, поля у нас read-only. Тогда просто не нужно реализовывать сеттеры.
Второй слой: представим, что мы разрабатываем библиотеку. Библиотека популярна, ей пользуются люди, её форкают на гитхабе, в общем, у неё звёздная жизнь). Мы, как хорошие разработчики, постоянно правим баги и добавляем фичи. И вот есть у нас в библиотеке класс... Совсем, как казалось поначалу, простой класса. И мы подумали, что не стоит вносить сложности в виде методов доступа, а просто сделали его поля публичными. И вот на очередной итерации добавления фич наш простой класс стал усложнятся. Добавилась логика, оказалось, что не любые значения полей валидны, и т.д. Кроме того, некоторые поля оказались избыточными, потому что их значения стало возможно вычислить на основе других полей или ещё как-нибудь. Но наша изначальная ошибка в проектировании связала нам руки. Тысячи пользователей нашей библиотеки по всему миру получают и устанавливают значения полей прямым присваиванием, ведь никакого интерфейса предусмотрено не было. И мы уже не можем ничего поменять, иначе куча ПО, которое использует нашу библиотеку, перестанет компилироваться. Предусмотри мы сразу методы доступа, мы бы могли жонглировать кишками класса как угодно.
Пример: стандартный класс std::vector имеет метод size, который, очевидно, возвращает количество элементов в векторе. Однако в реализации стандартной библиотеки, идущей в комплекте с gcc, например, никакого поля _size в векторе нет. Вектор там определяется указателями на начало и конец массива, а размер его равен _end - _start. Если бы разработчики изначально позволили обращаться к размеру вектора непосредственно через поле, то потом не смогли бы уже удалить это поле из класса, и, если им реально понадобилось бы хранить указатель на конец вектора ещё для каких-либо нужд, им пришлось бы добавить такое поле в дополнение у указателю на начало массива и полю size. Таким образом, грамотный дизайн класса изначально в дальнейшем может помочь сэкономить 4 байта
Но оговорюсь, что не нужно впадать в крайности, как, впрочем, и в любом другом деле. Если класс действительно простой и не грозит в дальнейшем усложниться, например, он представляет какой-либо хорошо изученный объект (реальный или абстрактный), то можно обойтись публичными полями. Скажем, класс Точка на двумерной плоскости. Очевидно, никаких ограничений на координаты не накладывается, и в общем случае эти координаты можно изменять. Так зачем лишний код и, потенциально, лишние такты процессора (если вдруг методы не заинлайнятся)?

Добавлено через 1 минуту
0x10, оу, похоже, я не так понял вопрос про объект в исключении... Думал, речь идёт про передачу какого-либо объекта (в данном случае name типа std::string) в объекте исключения...
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2015, 17:02
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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