Может ли кто-нибудь объяснить, в чем разница range_error
, out_of_range
и пара overflow_error
а также underflow_error
есть, когда я должен использовать каждый? Все они кажутся одинаковыми.
В соответствии с cppreference.com:
out_of_range
: Он сообщает об ошибках, которые являются следствием попытки доступа к элементам вне определенного диапазона.range_error
Он сообщает об ошибках, возникающих из-за того, что значение с плавающей запятой в некоторых вычислениях не может быть представлено, потому что оно слишком велико или слишком мало по величине. Если значение имеет целочисленный тип, std::underflow_error
или же std::overflow_error
должен быть использован.overflow_error
: Он сообщает об ошибках, которые возникают из-за того, что целочисленное значение в некоторых вычислениях не может быть представлено, поскольку оно имеет слишком большое положительное значение.В частности, у меня есть функция,
template<typename T>
void write_integer(const T &n) {
if(n < 0) { throw ??? }
if(some_limit < n) { throw ??? }
куда T
является целочисленным типом; функция выполняет некоторую проверку границ n
, чтобы увидеть, находится ли он в определенном диапазоне; если это не так, я хотел бы бросить какое-то исключение. Я в замешательстве, потому что:
out_of_range
Похоже, это для индексации и проверки границ массива, что я не делаю.range_error
Похоже на поплавки? (Но почему в таком языке, как C ++?)underflow_error
а также overflow_error
? Это действительно уместно?Из стандарта:
range_error
: Класс range_error определяет тип объектов, выданных как исключения для отчета диапазон ошибок во внутренних вычислениях.
out_of_range
: Класс out_of_range определяет тип объектов, генерируемых как исключения для сообщения значение аргумента не соответствует ожидаемому диапазону.
overflow_error
: Класс overflow_error определяет тип объектов, генерируемых как исключения для сообщения арифметическая ошибка переполнения.
underflow_error
: Класс underflow_error определяет тип объектов, генерируемых как исключения для сообщения арифметическая ошибка занижения.
Для вашей функции наиболее подходящим будет out_of_range
,
Я не много думал об этом, но мои рекомендации, как представляется:
out_of_range
когда мою абстракцию можно рассматривать как серию ведер или ямок (дискретных), и я просил несуществующее ведро или ямку. Главный пример — запрос четвертого элемента трехэлементного массива (слоты в массиве можно рассматривать как сегменты).
range_error
когда запрошенная операция не имеет математического смысла в рассматриваемой области (например, квадратный корень из отрицательного числа при работе с реальной областью).
overflow_error
а также underflow_error
когда результат будет превышать емкость базового типа. Например: целое число больше, чем может быть int
,