【问题标题】:Differences between out_of_range, range_error, and over/underflow_error?out_of_range、range_error 和 over/underflow_error 之间的区别?
【发布时间】:2014-04-10 04:48:01
【问题描述】:

有人能解释一下range_errorout_of_rangeoverflow_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?这些真的合适吗?

【问题讨论】:

  • 超出范围 = 输入值没有意义。其余的 = 输出值或中间值都无法表示。您可能需要考虑 std::domain_error。

标签: c++ exception outofrangeexception


【解决方案1】:

来自标准:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    • overflow_errorunderflow_error 当结果超出基础类型的容量时。例如:一个大于我的int 可以容纳的整数。

    【讨论】:

    • 我发现你的例子比标记的答案更有帮助,尤其是在range_error的情况下
    猜你喜欢
    • 2013-09-04
    • 2020-07-13
    • 2023-03-30
    • 2010-10-17
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    • 2014-09-20
    • 2010-10-28
    相关资源
    最近更新 更多