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

Tha*_*tos 10 c++ exception outofrangeexception

有人能解释什么之间的差异range_error,out_of_range以及一对,overflow_errorunderflow_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 ??? }
Run Code Online (Sandbox Code Playgroud)

哪里T是整体类型; 该函数进行一些边界检查n,看它是否在一定范围内; 如果不是,我想抛出一些例外.我很困惑,因为:

  • out_of_range 听起来像索引和数组边界检查,我没有做.
  • range_error似乎是花车?(但为什么,用C++这样的语言?)
  • underflow_erroroverflow_error?这些真的合适吗?

use*_*267 5

从标准:

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

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

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

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

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


Esc*_*alo 5

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

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

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

  • overflow_errorunderflow_error结果超出基础类型的容量时。例如:一个大于我的int.