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

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

Восстановить пароль Регистрация
 
 
Knjagskij
-4 / 6 / 0
Регистрация: 10.11.2008
Сообщений: 772
Завершенные тесты: 1
01.12.2015, 11:03     Когда нужно использовать исключения #1
Когда, по вашему, лучше использовать исключения?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.12.2015, 16:20     Когда нужно использовать исключения #21
Цитата Сообщение от Knjagskij Посмотреть сообщение
А мы обязательно должны передавать в исключении объект?
Крайне желательно. Объект несет в себе больше информации, чем простой тип. И дело не в том, что в объекте можно сохранить больше данных, а в том, что объекты различимы по типу. В этом случае легко отделимы друг от друга исключения различных библиотек.

Если из библиотечного метода вылетает std::invalid_argument, возможно, это исключение не было предусмотрено автором.
Если же вылетает library_name::SpecificException, то, вероятно, исключение предусмотрено и его нужно обрабатывать не так, как безликий invalid_argument.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2015, 17:02     Когда нужно использовать исключения
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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) в объекте исключения...
Yandex
Объявления
02.12.2015, 17:02     Когда нужно использовать исключения
Ответ Создать тему
Опции темы

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