c++ - out_of_range、range_error 和 over/underflow_error 之间的区别?

标签 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 似乎是为了 float ? (但为什么要用 C++ 这样的语言呢?)
  • underflow_erroroverflow_error?这些真的合适吗?

最佳答案

来自标准:

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

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

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

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

对于您的函数,最合适的是 out_of_range

关于c++ - out_of_range、range_error 和 over/underflow_error 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22978863/

相关文章:

c++ - 使用函数指针填充结构数组

c++ - 检查模板类是否存在函数

java - 线程 "main"java.lang.NullPointerException 中出现异常,不知道我做错了什么

objective-c - 防止 subarrayWithRange 中的 NSRangeException

c++ - 静态变量/双端队列和对象

c++ - 如何将 unsigned long 转换为 64 位的 time_t

c++ - log4cpp 给出 `unresolved external` 错误

c# - 如果异常是从 Microsoft 的代码中抛出的,我如何找出最初导致异常的原因?

Java 对象序列化 java.io.UTFDataFormatException

c# - 初始化列表上的 ArgumentOutOfRangeException