11

range_error有人可以解释,out_of_range和一对overflow_errorand之间的区别是什么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_erroroverflow_error?这些真的合适吗?
4

2 回答 2

9

从标准:

range_error: range_error 类定义了作为异常抛出的对象的类型,以报告内部计算中的范围错误

out_of_range: out_of_range 类定义作为异常抛出的对象的类型,以报告不在其预期范围内的参数值

overflow_error: 类overflow_error 定义作为异常抛出的对象的类型以报告算术溢出错误

underflow_error: underflow_error 类定义了作为异常抛出的对象类型,以报告算术下溢错误

对于您的功能,最合适的是out_of_range.

于 2014-04-10T04:54:30.243 回答
4

我没有考虑太多,但我的指导方针似乎是:

  • out_of_range当我的抽象可以被认为是一系列桶或鸽笼(离散)时,我要求一个不存在的桶或鸽笼。主要的例子是请求一个三元素数组的第四个元素(数组中的槽可以被认为是桶)。

  • range_error当请求的操作在所考虑的域中没有数学意义时(例如,处理实域时负数的平方根)。

  • overflow_error以及underflow_error结果何时超过基础类型的容量。例如:一个大于 my 可以容纳的整数int

于 2014-04-10T05:00:55.313 回答