Может ли кто-нибудь объяснить, в чем разница между 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? Это действительно уместно?
11
Thanatos 10 Апр 2014 в 08:48

2 ответа

Лучший ответ

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

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

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

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

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

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

9
user657267 10 Апр 2014 в 04:54

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

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

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

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

4
Escualo 10 Апр 2014 в 05:00