4

注意:我不能使用任何默认值。

我正在尝试制作一个非常简单的异常处理例程,或者至少制作一些看起来很重要的东西。我不想做太多,只是抛出异常并打印错误消息。

在.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);
};

在.cpp

void PersonValidator::PersonValidator(Person p) throw (PersonException) {
    if (p.getPhone < 0) {
        throw PersonException ("Person Number is invalid");
}

这里有什么问题或麻烦,如何才能做得更好?我在哪里实际打印错误消息?

4

2 回答 2

10

1)默认构造函数不是必需的,至少你现在有代码的方式,所以你可以删除

 MyException ();

2) 建议std::exception.

3)您可以通过捕获 a来捕获异常MyException&,并在那里打印消息:

try
{
    PersonValidator validator(Person());
}
catch(const MyException& ex)
{
    std::cout << ex.getMessage();
}

4)避免using在标题中使用指令。您的语法表明您using namespace std;在标题中有 a 。这是错误的,您应该支持全名限定,至少在标题中:

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) {
 }
于 2012-05-15T12:45:32.207 回答
0

您还可以使用默认构造函数来初始化一些预定义的值。

MyException () : message ("throwing an exception") {};
于 2012-05-15T12:54:11.217 回答