【发布时间】:2018-08-28 12:46:14
【问题描述】:
我必须编写一个包含个人数据(例如姓名、姓氏和年龄)的类定义,条件是年龄不能小于 1。我试图在类构造函数中捕获一个异常:
class Person {
public:
Person (std::string name, std::string surname, int age) {
try{
this -> name = name;
this -> surname = surname;
this -> age = age;
if(age < 1)
throw std::string("Error! Age cannot be less than 1!");
}
catch(std::string ex){
cout << ex << endl;
}
};
private:
std::string name;
std::string surname;
int age;
};
这很好用,但最重要的是 根本不应该创建年龄 ,而使用此解决方案时,我只会收到错误,并且对象为 person1("Thomas ", "Something", -5) 仍在创建中。
“阻止”创建不满足条件的对象的最佳方法是什么?
【问题讨论】:
-
不要捕获异常。一旦抛出异常就捕获它没有多大意义。
-
如果您捕获到异常,该语言会假定您修复了错误。如果无法修复,请不要抓住并吞下它。
-
捕获(而不是重新抛出)异常会告诉程序您处理了错误。异常不会自行传播。
-
要明确一点,如果不捕获异常,就不会创建对象。
-
@GarrettGutierrez 1) “在我看来,在构造函数中引发异常通常是不明智的”您将如何处理由于某种原因无法创建对象的情况或其他?如果您无法使用它,为什么要创建一个处于无效状态的对象? 2)“不会调用析构函数,因为容器实际上并未完全构造。”是什么阻止您捕获异常、清理所有使用的资源并重新抛出异常?
标签: c++ class object constructor conditional-statements