对C ++异常处理非常困惑

时间:2017-10-04 08:48:37

标签: c++ visual-c++ exception-handling integer-overflow

尝试将异常处理添加到我的C ++程序中,但我觉得它很混乱。程序将值i和j设置为它们的最高可能值并递增它们。我想我希望异常处理在发生时检测整数溢出/环绕(?)

到目前为止,这就是我所拥有的:

#include <iostream>
#include <limits.h>
#include <exception>
#include <stdexcept>
using namespace std;

int main() {
    int i;
    unsigned int j;

    try{
            i = INT_MAX;
            i++;
            cout<<i;
    }
    catch( const std::exception& e){
    cout<<"Exception Error!";
    }   


    try{
            j = UINT_MAX;
            j++;
            cout<<j;
    }
    catch(const std::exception& e){
    cout<<"Exception Error!";
    }
}

程序运行,但异常处理部分不起作用。

可能是什么问题?

3 个答案:

答案 0 :(得分:6)

i递增到INT_MAX之外的行为是 undefined 。那是因为它是一个有符号整数类型。在这种情况下,我从未遇到过抛出异常的实现。 (典型的行为是环绕INT_MIN,但依赖于此。)

j增加到超出UINT_MAX 必须环绕为0.这是因为它是unsigned类型。也就是说,必须从不抛出异常。

答案 1 :(得分:3)

C ++没有定义在整数溢出的情况下抛出的任何异常。如果您想要实现此类行为,则需要一些具有相应功能的整数类包装器,例如Safe Int library。例如:

#include <safeint.h>

#include <iostream>

int main()
{
    try
    {
        ::msl::utilities::SafeInt<int> j;
        for(;;)
        {
            ++j;
        }
    }
    catch(::msl::utilities::SafeIntException const & exception)
    {
        switch(exception.m_code)
        {
            case ::msl::utilities::SafeIntArithmeticOverflow:
            {
                ::std::cout << "overflow detected" << ::std::endl;
                break;
            }
            default:
            {
                break;
            }
        }
    }
    return(0);
}

答案 2 :(得分:0)

在C ++中,异常不会发生。 throw关键字会引发异常;如果您的代码(或您链接到的代码)没有throw something(),则不会抛出异常。

然而,这并不完全正确:有一些时髦的情况,代码做了不适当的事情(正式地,代码有未定义的行为),可能导致抛出异常。这超出了语言定义的规则,因此不可移植且不可靠(是的,我正在看着你,Windows SEH)。