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

时间:2012-05-15 12:41:49

标签: c++ exception-handling

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

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

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");
}

这有什么问题或繁琐,怎么可能做得更好?我在哪里打印错误信息?

2 个答案:

答案 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") {};