【问题标题】:Exception not catching overflow or underflow in C++在 C++ 中未捕获上溢或下溢的异常
【发布时间】:2022-01-16 13:03:12
【问题描述】:

如果两个数字溢出,则不会捕获异常。

输出只打印错误的负数。

Test operator*(const Test &object) const
{
    try
    {
        return Test(value * object.value);
    }
    catch (std::overflow_error &e)
    {
        cout << e.what() << endl;
    }
    catch (std::underflow_error &e)
    {
        cout << e.what() << endl;
    }
}

主要:

Test t1(533222220);
Test t2(300002222);
Test t = t1 * t2; // does not throw exception but  t1 * t2 -1416076888

【问题讨论】:

  • 什么是价值?请发帖minimal reproducible example。如果 value 是整数类型,则乘法永远不会抛出异常。
  • 算术溢出不需要抛出异常。
  • @S.M. — 直到最近,有符号算术溢出导致未定义的行为,因此它可能抛出异常。当然,在实践中,它从来没有这样做过。
  • @PeteBecker 我认为它们仍然未定义,尽管有保证的二进制补码。

标签: c++ exception overflow underflow


【解决方案1】:

标准 C++ 中,catch 块仅适用于 throw 语句,并且您显示的代码中没有 throw 语句。

一些编译器具有供应商扩展,可以将非异常错误(如整数溢出)转换为 C++ 异常,但您的示例显然不是这种情况。

【讨论】:

    【解决方案2】:

    如果两个数字溢出,则不会捕获异常。

    正确。整数算术不会引发异常。如果有符号整数运算溢出,则程序的行为未定义。

    【讨论】:

      【解决方案3】:

      不管听起来如何,std::overflow_errorstd::underflow_error 默认情况下不会检测算术上溢和下溢。在标准库中,overflow_error 仅用于将bitset 转换为数字,而从不使用underflow_error。任何其他上溢和下溢都必须手动检查。

      有关如何检测溢出的更多信息,您可以查看:How do I detect unsigned integer multiply overflow?

      【讨论】:

        猜你喜欢
        • 2010-12-08
        • 2011-01-10
        • 1970-01-01
        • 2012-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多