有人可以解释range_error
,out_of_range
以及overflow_error
和underflow_error
对之间的差异,我应该使用它们吗?他们似乎都是一样的。
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
?这些真的合适吗?答案 0 :(得分:3)
来自标准:
range_error
:类range_error定义了在内部计算中报告范围错误
out_of_range
:类out_of_range定义作为异常引发的对象类型,以报告参数值不在其预期范围内。
overflow_error
:类overflow_error定义作为异常报告算术溢出错误的对象类型。
underflow_error
:类underflow_error定义了作为异常报告算术下溢错误的对象类型。
对于您的功能,最合适的是out_of_range
。
答案 1 :(得分:3)
我没有想过很多,但我的指导方针似乎是:
out_of_range
当我的抽象被认为是一系列水桶或鸽笼(离散)时,我要求一个不存在的水桶或鸽笼。主要的例子是请求三元素数组的第四个元素(数组中的插槽可以被认为是存储桶)。
range_error
当所请求的操作在所考虑的域中没有数学意义时(例如,处理真实域时负数的平方根)。
overflow_error
和underflow_error
。例如:一个整数,大于int
。