|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
||||||
Исключение в конструкторе шаблонного класса15.03.2017, 10:58. Показов 3946. Ответов 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
|
||
|
1358 / 856 / 366
Регистрация: 26.02.2015
Сообщений: 3,814
|
|
| 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) класса возникает некое "необработанное исключение" Возможно ли создание объекта шаблонного класса в функции этого класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|