2

例外処理をしたい。__LINE____FILE__マクロを使用する予定です。

ベクトル構造のクラスを実装するヘッダーVectors.hppがいくつかあります。このクラスでは、を実装し、operator []この演算子が範囲外のインデックスで使用されるたびに例外をスローしたいと思います。このクラスをいくつかのソースtest.cppでテストします。次に、これが発生したtest.cppの正確な行を確認できるようにします。

ただし__LINE__、ヘッダーを含めるたびにマクロが無効になることはわかっているので、私が取得したのはVectors.hppの行であり、test.cppの行ではなく例外を処理します。これを回避する良い方法はありますか?または、自分の__LINE__マクロをどのように実装しますか?

4

3 に答える 3

5

__LINE__マクロが無効になることはありません。書いたところが展開されます。コードを記述する方法は 2 つあります (より正確には、トークンを生成する方法は 2 つあります)。

  • 手書きで書く
  • プリプロセッサを使用してコードを記述する

あなたが持っている場合は、foo.cppこのようなファイルです(単なる例であり、実際には非常に悪いコードです)

class Foo {
public:
    Frob operator[] (size_t) { throw __LINE__ }
};

then__LINE__は常に 3 で、__FILE__常にfoo.cppです。

これは、マクロが使用される場所で展開されるためです。解決策は、それらを必要な場所に展開する方法を見つけることです。これを行う唯一の方法は、別のマクロを定義することです。

#define safe_subscript(foo, index) \
      try {foo[index];} \
      catch(...) { std::cout << __LINE__ << '\n'; }

....
safe_subscript(foo, 256);

しかし、ご覧のとおり、これは非常に醜いコードと回避策につながります。

実際の解決策: 範囲外 ( throw std::out_of_range) で例外をスローするか、標準ライブラリのように実行します。

T& operator[] (size_type i) { return store_[i]; }
T& at (size_type i) { if (i>size_) throw std::out_of_range("crap");
                      return store_[i]; }

T operator[] (size_type i) const { return store_[i]; }
T at (size_type i) const { if (i>size_) throw std::out_of_range("crap");
                           return store_[i]; }

ユーザーが例外を受け取った場合、プログラミング エラーが発生した場所デバッグする必要があります。

于 2012-07-31T15:40:30.627 に答える
1

例外の一部として現在の行を渡すことができます。例外を次のように定義します

struct MyException : public std::exception {
    MyException(const char* line) : errorLine(line);
    const char* errorLine;
};

そして、次のように使用します。

if (isError())
     throw MyException(__LINE__);
于 2012-07-31T15:42:50.260 に答える
0

シンプルです。例外をキャッチするときにその情報を追加する必要があります。通常、明確なエラー メッセージをマウントするためのいくつかの追加属性を持つ std::exception を拡張するクラスを作成し__LINE__ます__FILE____FUNCTION__

これも答えます: キャッチブロック内でc ++例外がスローされる場所に関する情報を取得しますか?

于 2012-07-31T15:43:55.833 に答える