Какое стандартное исключение кинуть?
От: пффф  
Дата: 14.02.25 14:09
Оценка:
Привет

Ищу по ключу в мапе, обычно всё должно находится, если не найдено — это беда-беда. Хочу кинуть какое-то из стандартных исключений, но что-то не очень понятно, какое лучше всего подходит к данной ситуации
Re: Какое стандартное исключение кинуть?
От: m2user  
Дата: 14.02.25 14:20
Оценка:
std::invalid_argument
Re[2]: Какое стандартное исключение кинуть?
От: пффф  
Дата: 14.02.25 14:24
Оценка:
Здравствуйте, m2user, Вы писали:

M>std::invalid_argument


Его кидают std::bitset::bitset, and the std::stoi and std::stof families of functions при ошибках конвертации входной строки. Как бы совсем не то

https://en.cppreference.com/w/cpp/error/invalid_argument

Пока склоняюсь к range_error
Re[3]: Какое стандартное исключение кинуть?
От: m2user  
Дата: 14.02.25 14:34
Оценка:
П>Пока склоняюсь к range_error

Почему именно range_error (std::runtime_error), а не out_of_range (std::logic_error)?
Re[4]: Какое стандартное исключение кинуть?
От: пффф  
Дата: 14.02.25 14:44
Оценка:
Здравствуйте, m2user, Вы писали:

П>>Пока склоняюсь к range_error


M>Почему именно range_error (std::runtime_error), а не out_of_range (std::logic_error)?


Моё поведение у меня ассоциируется с обращением по недопустимому адресу в ОС, это мне кажется больше похоже на runtime_error, а не logic_error. Хотя, насчет out_of_range тоже подумываю

Хотя, глянул range_error:

Defines a type of object to be thrown as exception. It can be used to report range errors (that is, situations where a result of a computation cannot be represented by the destination type).


И out_of_range:

Defines a type of object to be thrown as exception. It reports errors that are consequence of attempt to access elements out of defined range.


По идее да, надо кидать out_of_range. Но смотрю std::stoull:

Exceptions

std::invalid_argument if no conversion could be performed.
std::out_of_range if the converted value would fall out of the range of the result type or if the underlying function (std::strtoul or std::strtoull) sets errno to ERANGE.


Хотя, по идее, должна кидать как раз range_error
Отредактировано 14.02.2025 14:50 пффф . Предыдущая версия .
Re: Какое стандартное исключение кинуть?
От: Pavel Dvorkin Россия  
Дата: 14.02.25 14:58
Оценка:
Здравствуйте, пффф, Вы писали:

П>Ищу по ключу в мапе, обычно всё должно находится, если не найдено — это беда-беда. Хочу кинуть какое-то из стандартных исключений, но что-то не очень понятно, какое лучше всего подходит к данной ситуации


Отсутствие ключа в мэпе само по себе не есть исключительная ситуация для кода библиотеки. Это не индекс за пределами длины массива. Поэтому найти подходящее исключение и не удается.

Наиболее логичное ИМХО — свой наследник от runtime_error или logic_error
With best regards
Pavel Dvorkin
Re[2]: Какое стандартное исключение кинуть?
От: rg45 СССР  
Дата: 14.02.25 15:50
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Отсутствие ключа в мэпе само по себе не есть исключительная ситуация для кода библиотеки. Это не индекс за пределами длины массива. Поэтому найти подходящее исключение и не удается.


Принимая во внимание то, что концепция range в C++ имеет несколько специфичный смысл, отличный, например, от математического, и что map — это разновидность range, то отсутствие некоторого ключа в мапе вполне может быть квалифицировано как "out of range". И то, что не является исключительной ситуацией для стандартной библиотеки, вполне может оказаться исключительной ситуацией с точки зрения логики пользовательской программы. Но класс исключения я бы завёл всё-таки свой, наверное.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 14.02.2025 15:53 rg45 . Предыдущая версия . Еще …
Отредактировано 14.02.2025 15:51 rg45 . Предыдущая версия .
Re: Какое стандартное исключение кинуть?
От: Chorkov Россия  
Дата: 18.02.25 09:41
Оценка: +3
Здравствуйте, пффф, Вы писали:

П>Привет


П>Ищу по ключу в мапе, обычно всё должно находится, если не найдено — это беда-беда. Хочу кинуть какое-то из стандартных исключений, но что-то не очень понятно, какое лучше всего подходит к данной ситуации


std::map бросает std::out_of_range. https://en.cppreference.com/w/cpp/container/map/at

Можно унаследоваться от него, если захочется обрабатывать свое исключение отдельно от стандартного.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.