异常以简单的方式处理语法问题

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)