注意:我不能使用任何默认值。
我正在尝试制作一个非常简单的异常处理例程,或者至少制作一些看起来很重要的东西。我不想做太多,只是抛出异常并打印错误信息。
in .h
class MyException {
protected: string message;
public:
MyException (string mes) {
this->message = mes;
}
MyException (); // is this necessary ? does it do anything ?
string getMessage() const {
return this->message;
}
};
我想要的是拥有“PersonException”和“ActivityException”。可能会使用模板,但不确定是否会有效。
class PersonException:public MyException {
public:
PersonException (string message):MyException(message) {
}
};
class PersonValidator {
public:
PersonValidator (Person p) throw (PersonException);
};
in .cpp
void PersonValidator::PersonValidator(Person p) throw (PersonException) {
if (p.getPhone < 0) {
throw PersonException ("Person Number is invalid");
}
这有什么问题或繁琐,怎么可能做得更好?我在哪里打印错误信息?
答案 0 :(得分:10)
1)默认构造函数不是必需的,至少你现在拥有代码的方式,所以你可以删除
MyException ();
2)建议从std::exception
派生例外。
3)您可以通过捕获MyException&
捕捉异常,然后在那里打印消息:
try
{
PersonValidator validator(Person());
}
catch(const MyException& ex)
{
std::cout << ex.getMessage();
}
4)在标题中避免使用using
指令。您的语法表明标题中有using namespace std;
。这是错的,你应该赞成全名资格,至少在标题中是这样的:
protected: std::string message;
MyException (std::string mes)
等
5)支持传递const引用而不是传递值,对于复杂类型:
MyException (const std::string& mes)
PersonValidator (const Person& p)
6)瞄准const正确性:
std::string getMessage()
应该是:
std::string getMessage() const
因为它不会改变任何成员。
7)使用初始化列表:
MyException (string mes) {
this->message = mes;
}
变为
MyException (string mes) : message(mes) {
}
答案 1 :(得分:0)
您也可以使用默认构造函数初始化为某个预定义的值。
MyException () : message ("throwing an exception") {};