Kal*_*lec 4 c++ exception-handling
注意:我不能使用任何默认值.
我试图做一个非常简单的异常处理例程,或者至少做一些看起来很重要的事情.我不想做太多,只是抛出异常并打印错误消息.
在.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;
}
};
Run Code Online (Sandbox Code Playgroud)
我想要的是拥有"PersonException"和"ActivityException".可能会使用模板但不确定是否可以解决问题.
class PersonException:public MyException {
public:
PersonException (string message):MyException(message) {
}
};
class PersonValidator {
public:
PersonValidator (Person p) throw (PersonException);
};
Run Code Online (Sandbox Code Playgroud)
在.cpp
void PersonValidator::PersonValidator(Person p) throw (PersonException) {
if (p.getPhone < 0) {
throw PersonException ("Person Number is invalid");
}
Run Code Online (Sandbox Code Playgroud)
这有什么不对或麻烦,怎么可能做得更好?我在哪里打印错误信息?
Luc*_*ore 10
1)默认构造函数不是必需的,至少你现在拥有代码的方式,所以你可以删除
MyException ();
Run Code Online (Sandbox Code Playgroud)
2)建议从中派生例外std::exception.
3)您可以通过捕获a 来捕获异常MyException&,并在那里打印消息:
try
{
PersonValidator validator(Person());
}
catch(const MyException& ex)
{
std::cout << ex.getMessage();
}
Run Code Online (Sandbox Code Playgroud)
4)避免using在标题中使用指令.您的语法表明您using namespace std;在标题中有一个.那是错的,你应该赞成全名资格,至少在标题中:
protected: std::string message;
MyException (std::string mes)
Run Code Online (Sandbox Code Playgroud)
等等
5)对于复杂类型,赞成通过const引用传递而不是传递值:
MyException (const std::string& mes)
PersonValidator (const Person& p)
Run Code Online (Sandbox Code Playgroud)
6)瞄准const正确性:
std::string getMessage()
Run Code Online (Sandbox Code Playgroud)
应该:
std::string getMessage() const
Run Code Online (Sandbox Code Playgroud)
因为它不会改变任何成员.
7)使用初始化列表:
MyException (string mes) {
this->message = mes;
}
Run Code Online (Sandbox Code Playgroud)
变
MyException (string mes) : message(mes) {
}
Run Code Online (Sandbox Code Playgroud)