n9p4
n9p4

Reputation: 277

Exception not catching overflow or underflow in C++

Exception not catching if two numbers are overflowing.

The output only printing the wrong number which is negative.

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;
    }
}

In main:

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

Upvotes: 0

Views: 955

Answers (3)

Remy Lebeau
Remy Lebeau

Reputation: 596592

In standard C++, catch blocks only work with throw statements, and there are no throw statements in the code you have shown.

Some compilers have vendor extensions that may convert non-exception errors, like integer overflows, into C++ exceptions, but your example is clearly not a case of that happening.

Upvotes: 1

eerorika
eerorika

Reputation: 238361

Exception not catching if two numbers are overflowing.

Correct. No exceptions are thrown by integer arithmetic. If signed integer operation overflows, then the behaviour of the program is undefined.

Upvotes: 3

Ranoiaetep
Ranoiaetep

Reputation: 6647

Despite how it sounds like, std::overflow_error and std::underflow_error does not detect arithmetic overflow and underflow by default. In standard library, overflow_error is only used for converting bitset to number, and underflow_error is never used. Any other overflow and underflow must be checked manually.

For more about how to detect overflows, you might check: How do I detect unsigned integer multiply overflow?

Upvotes: 1

Related Questions