抛出和捕获std::string

4

我写了一些奇怪的代码,但出乎意料地运行成功了。但现在我不知道我该抛什么异常以及如何捕获它:

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

请帮我解决这段代码。


1
你想了解什么?那段代码应该做什么? - Digital_Reality
2
你正在抛出std::string(),可以通过const std::string&或值std::string进行捕获。希望你不是在恶作剧 :-) - Koushik Shetty
1
请尝试此链接:http://www.exceptionsafecode.com/ - Koushik Shetty
1
我写了一段奇怪的代码,但出乎意料地它能够工作。这太棒了,我把它加入了我的引用列表:D / 编辑:我觉得这太棒了,所以我把它添加到了我的个人资料页面。 - Sebastian Mach
2
如果你抛出 std::runtime_error,那么父级代码可以捕获 std::exception 并获取你的异常,而无需为你的代码添加额外的异常处理程序。 - M.M
显示剩余2条评论
3个回答

2

在C++中,你可以抛出任何类型的对象。通常使用的是std::exception或其派生类型,但也可以是其他任何类型,例如MFC中的CException_com_error都与std::exception无关。无论你抛出什么,你必须捕获同样的类型。(例如你不能抛出一个std::string然后捕获一个std::exception。)


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

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

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

但是,就像C++中的许多其他事情一样,仅仅因为你可以做到这一点,并不意味着你应该这样做。

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

提出这项建议的原因是,您希望构建一个异常层次结构,允许在不同的泛化层次上捕获:如果我对刚才发生的异常类型不感兴趣,我只需捕获std::exception;如果我只想处理某些特定类型的错误,则可以在异常层次结构中更进一步地捕获派生类。

如果将异常类型与程序中使用的其他类型分开,这样的异常层次结构将更易于维护和理解。此外,这个指南使得人们不那么容易滥用异常作为炫耀的返回值,这是您永远不应该做的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接