Различия между out_of_range, range_error и over / underflow_error?

Может ли кто-нибудь объяснить, в чем разница 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? Это действительно уместно?

8

Решение

Из стандарта:

range_error: Класс range_error определяет тип объектов, выданных как исключения для отчета диапазон ошибок во внутренних вычислениях.

out_of_range: Класс out_of_range определяет тип объектов, генерируемых как исключения для сообщения значение аргумента не соответствует ожидаемому диапазону.

overflow_error: Класс overflow_error определяет тип объектов, генерируемых как исключения для сообщения арифметическая ошибка переполнения.

underflow_error: Класс underflow_error определяет тип объектов, генерируемых как исключения для сообщения арифметическая ошибка занижения.

Для вашей функции наиболее подходящим будет out_of_range,

3

Другие решения

Я не много думал об этом, но мои рекомендации, как представляется:

  • out_of_range когда мою абстракцию можно рассматривать как серию ведер или ямок (дискретных), и я просил несуществующее ведро или ямку. Главный пример — запрос четвертого элемента трехэлементного массива (слоты в массиве можно рассматривать как сегменты).

  • range_error когда запрошенная операция не имеет математического смысла в рассматриваемой области (например, квадратный корень из отрицательного числа при работе с реальной областью).

  • overflow_error а также underflow_error когда результат будет превышать емкость базового типа. Например: целое число больше, чем может быть int,

3

По вопросам рекламы [email protected]