|
1359 / 857 / 366
Регистрация: 26.02.2015
Сообщений: 3,824
|
||||||
Исключение в конструкторе шаблонного класса15.03.2017, 10:58. Показов 4181. Ответов 43
Добрый день!
Пишу класс дробей и, соответственно, если пользователь введёт 0 в знаменатель с помощью оператора >> или с помощью конструктора с 2мя параметрами, то нужно вызвать исключение. Но как это сделать, я не понимаю. Fraction.h
Сделал так, но при генерации исключения возникает ошибка "Возникло необработанное исключение по адресу ... исключение Microsoft C++: Fraction<int>::denominatorEqualsToZero ..." Скажите, пожалуйста, как правильно выполнять исключения в конструкторах и, тем более, в шаблонных.
0
|
||||||
| 15.03.2017, 10:58 | |
|
Ответы с готовыми решениями:
43
|
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 15.03.2017, 15:05 | |
|
4
|
|
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||
| 15.03.2017, 15:10 | ||
|
2
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 15.03.2017, 15:45 | ||
|
В случае библиотечного кода вариант ТС с эксепшеном в конструкторе нормальный Главное чтоб аккуратно и без утечек
0
|
||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||
| 15.03.2017, 15:53 | ||||||
|
Я за вариант hoggy , с assert - уже вижу код sys_beginner,
0
|
||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 15.03.2017, 17:10 | ||
|
это класс дроби. знаменатель в принципе не должен быть равен нулю. если это не так, значит это программная ошибка. (такая же, как например выход за пределы диапазона массива) в тех случаях, когда данные приходят откуда то извне, валидировать их нужно сразу при поступлении. то бишь перед тем, как кормить внутреннию инфраструктуру . таким образом ассерт защиты вполне достаточно для данного случая. кроме того, не забываем: эксепшены не бесплатны. они просаживают рантайм, и не позволяют компиляторам сгенерировать максимально эффективный код. это при этом, что классы подобные "дробям" используются в число-дробилках. то бишь там, где обычно особенно критична скорость вычислений. поэтому, конструктор класса дробей должен быть помечен как "никогда не кидающий исключения", что позволит компилятору сгенерировать более эффективный код.
3
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 15.03.2017, 17:58 | |||
|
rikimaru2013,
Откуда вы видите? Вы бы сначала попросили привести пример а потом уже делали бы выводы Моя мысль никак не связана с реализацией которую вы описали Но я не об этомЗависит от логики Например может быть так что эта цифра получается из вне от пользователя И когда он передает 0 нужно просто показать красивую ошибку а не укладывать программу спать
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 15.03.2017, 18:48 | |||||
|
на ноль делить нельзя вне зависимости от ситуации
0
|
|||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||
| 15.03.2017, 18:57 | ||
|
0
|
||
|
1359 / 857 / 366
Регистрация: 26.02.2015
Сообщений: 3,824
|
|
| 15.03.2017, 20:55 [ТС] | |
|
Т.е. если бы я сейчас писал программу с красивым финтифлюшным интерфейсом, то чтобы не закрывать программу с помощью assert, мне нужно было бы проверить введенные пользователем данные ДО вызова конструктора класса Fraction, выдать красивое окно с ошибкой и предложить ввести данные повторно?
Добавлено через 42 секунды И тогда бы не пришлось кидать исключения и использовать assert (даже в конструкторе).
0
|
|
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
||||||
| 15.03.2017, 21:03 | ||||||
|
Nishen, вот пример assert
0
|
||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 15.03.2017, 22:13 | |||||
|
assert - отладочное средство. его код не попадает в релизную сборку. 2. программисты - люди. иногда они ошибаются. assert`тами проверяются несбыточные ситуации, которых не должно быть в принципе. на этапе разработки это даёт дополнительную защиту от ошибок. Добавлено через 1 минуту assert пишется с маленькой буквы. 2. тип данных w - беззнаковое. 0u - тоже беззнаковое. итого: проверка абсолютно бессмысленная. потому что беззнаковые всегда больше либо равны нулю.
0
|
|||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|||
| 15.03.2017, 22:56 | |||
там оператор больше
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||||
| 16.03.2017, 10:16 | ||||||||
|
rikimaru2013,
Я имел ввиду, что если переданное число равно нулю - просто бросить исключение. При этом убедиться что перед броском не было создано объектов в динамической памяти
Под общим случаем имеется ввиду "броски исключения в конструкторах", и хочу заметить, что такие случаи все таки есть. Например, std::regex.Исключение в конструкторе шаблонного класса Но чуть позже ТС сказал, как быть, если он пишет библиотечный код и нужно иметь возможность сообщать пользователям библиотеки тогда, когда библиотека используется некорректно. Вот тот самый пост: Исключение в конструкторе шаблонного класса После этого я поддержал идею с исключениями, думаю уже стало понятно почему Далее вы предложили вариант с assert тут Исключение в конструкторе шаблонного класса Я в свою очередь не согласился ввиду того, что assert завалит программу и пользователю библиотеки мы уже ничего в случае ошибки сообщить не сможем. Так что же я сказал не так? Добавлено через 9 минут P.S Мы же не нолики и единички обсуждаем, а конечный результат который нужен ТС
0
|
||||||||
|
Любитель чаепитий
|
||
| 16.03.2017, 10:44 | ||
|
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 16.03.2017, 12:04 | |
|
GbaLog-,
Да ) Привет RAII
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 16.03.2017, 12:44 | |||
|
assert именно для того и нужен, что бы сообщить пользователю об ошибке. вам и ТС нужно понять, в чем различие "программной ошибки" и "нештатной систуации".
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 16.03.2017, 12:46 | ||
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 16.03.2017, 13:00 | |
|
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 16.03.2017, 13:29 | |
|
hoggy,
Не хочу спорить но тем не менее С точки зрения пользователя это может не считаться ошибкой Получаются данные откуда угодно - и передаются в конструктор объекта Вариант с ассертом тут не подходит Хотя бы потому что эту библиотеку для работы с числами может использовать совсем другая библиотека, которая по своей сути не является математической. Так вот, если разработчик конечной библиотеки будет использовать вашу версию с ассертом, то как конечный пользователь будет разбираться с ошибками? Лазить в исходный код либы а потом другой либы? Или как вообще будет оформлена документация такой библиотеки? "Вы знаете, мы в реализации нашей библиотеки используем другую библиотеку разработчик которой поставил там ассерт. Так что если программа упадет, это не по нашей вине! Следите за числами!" Так что ли? Казалось бы причем тут числа, ведь мы используем конечную библиотеку которая не является математической...
0
|
|
| 16.03.2017, 13:29 | |
|
Помогаю со студенческими работами здесь
40
Исключение в конструкторе класса Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? Вызов метода у шаблонного поля, шаблонного класса В конструкторе копирования отцовского (_str) класса возникает некое "необработанное исключение" Возможно ли создание объекта шаблонного класса в функции этого класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
|
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика
Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
|
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации:
В классе Работник добавить:
накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни
коэффициентПрезентеизма — снижает продуктивность. . .
|
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день.
Для работы необходим браузер,. . .
|
|
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности
Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано.
. . .
|
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
|
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива
Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
|
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так?
Да, всё верно. Я — искусственный интеллект.
Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
|