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) をキャッチして例外をキャッチし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 に答える