c ++程序,但异常不起作用

时间:2014-05-23 05:22:20

标签: c++ exception error-handling

我试图在MinGW中编写这个简单的代码,但每当我尝试将x设置为负数时,它会显示消息"超出系统范围!!"它应该显示" x低于0"。我只是不明白为什么它一直只显示那条消息......

    #include <iostream>

    #define Max 80
    #define Min 20

    using namespace std;

    class Punct
    {
protected:
    int x,y;

public:
    class xZero{};
    class xOutOfSystemBounds{};

    Punct (unsigned a, unsigned b)
    {
        x=a;
        y=b;
    }

    unsigned Getx()
    {
        return x;
    }

    unsigned Gety()
    {
        return y;
    }

    void Setx( unsigned a )
    {
        if( a<0 )
            throw xZero();
                else
                if(( a>Max || a<Min ) && a>0 )
                    throw xOutOfSystemBounds();
                    else
                    x=a;
    }

    void Sety( unsigned a )
    {
        if( a<0 )
            throw xZero();
                else
                if( a>Max || a<Min )
                    throw xOutOfSystemBounds();
                    else
                    y=a;
    }
};

int main()
{
    Punct w(4,29);

    try
    {
        w.Setx(-2);
        cout<<"noul x:>"<<w.Getx()<<'\n';
    }

    catch( Punct::xZero )
    {
        cout<<"x is lower than 0"<<'\n';
    }

    catch( Punct::xOutOfSystemBounds )
    {
        cout<<"out of system bounds!!"<<'\n';
    }

    catch( ... )
    {
        cout<<"Expresie necunoscuta!"<<'\n';
    }

    system("PAUSE");
    return 0;
 }

2 个答案:

答案 0 :(得分:1)

void Setx( unsigned a )将参数视为unsigned int。当您发送(已签名)否定号码时,它会转换为unsigned int,并成为一个大的正数(&gt; Max)。因此抛出xOutOfSystemBounds异常,而不是xZero。你必须改变

void Setx( int a ){ ...}

答案 1 :(得分:1)

那是因为你在你的setter参数中使用unsigned,根据定义,它没有负值。将其更改为int,它应该按预期运行。