抛出并捕获std :: string

时间:2014-03-20 07:27:52

标签: c++ string class throw

我制作了奇怪的代码,但令人惊讶的是它有效。但是现在我不知道我扔了什么,我怎么能抓住它:

class Date {
private:
    int day;
    int month;
    int year;
    int daysPerMonth[];
public:
    Date( int day, int month, int year ) {
        int daysPerMonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

        if(isValidDate(day, month, year)) {
            this->day = day;
            this->month = month;
            this->year = year;
        } else {
            throw std::string("No valid input date numbers...");//what i throw???
        }
    }

请帮我处理代码。

3 个答案:

答案 0 :(得分:2)

您可以使用以下相似(未编译): -

class Date {
private:
int day;
int month;
int year;
int daysPerMonth[];
public:
Date( int day, int month, int year ) {
    int daysPerMonth[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

    if(isValidDate(day, month, year)) 
    {
        this->day = day;
        this->month = month;
        this->year = year;
    } else {
        throw std::string("No valid input date numbers...");//what i throw???
        }
    }
};

int main()
{
 try{
    Date d(55,223,0122);
  }
 catch(std::string &e)
 {
    // Do necessary handling
  }
}

答案 1 :(得分:2)

在C ++中,您可以抛出任何类型的对象。通常是std::exception或从中派生的类型,但它可以是其他任何东西。例如,MFC中的CException_com_errorstd::exception无关。无论你扔什么,你必须抓住同样的东西。 (你不能抛出std::string并抓住std::exception。)

答案 2 :(得分:1)

C ++允许您throw任何类型的值(包括基本类型)。

try {
    throw 42;
} catch(int e) {
    std::cout << "Caught: " << e << "\n";
}

但与C ++中的许多其他内容一样,仅仅因为你可以做到这一点,并不意味着你应该这样做。

这里的usual advice是以某种方式抛出从std::exception派生的专用异常对象。也就是说,如果抛出的类型不应该在其他上下文中使用。如果要将某个值与异常相关联,请构建一个包含该值作为成员的异常包装类,而不是直接抛出值的类型。

这个建议的基本原理是你想要构建一个允许捕捉不同层次的异常的异常层次结构:如果我对确切的异常类型不感兴趣,我只会抓住std::exception;如果我只想处理某些类型的错误,我会在异常层次结构中进一步捕获派生类。

如果保持异常类型与程序中使用的其他类型不同,则此类异常层次结构更容易维护和推理。此外,本指南使人们不会将异常作为荣耀的回报值进行滥用,这是你永远不应该做的事情。