out_of_range,range_error和over / underflow_error之间的区别?

时间:2014-04-10 04:48:02

标签: c++ exception outofrangeexception

有人可以解释range_errorout_of_range以及overflow_errorunderflow_error对之间的差异,我应该使用它们吗?他们似乎都是一样的。

根据cppreference.com

  • out_of_range:它报告尝试访问超出定义范围的元素的错误。
  • range_error:它报告出现的错误,因为某些计算中的浮点值无法表示,因为它的数量太大或太小。如果值具有整数类型,则应使用std::underflow_errorstd::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?这些真的合适吗?

2 个答案:

答案 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_errorunderflow_error。例如:一个整数,大于int