例外のスライスによって引き起こされた、コード内の非常に微妙なバグを修正したばかりで、何が起こっているのかを正確に理解したいと思っています。
基本例外クラス、派生クラス、および関連する関数は次のとおりです。
class Exception
{
public:
// construction
Exception(int code, const char* format="", ...);
virtual ~Exception(void);
<snip - get/set routines and print function>
protected:
private:
int mCode; // thrower sets this
char mMessage[Exception::MessageLen]; // thrower says this FIXME: use String
};
class Derived : public Exception {
public:
Derived (const char* throwerSays) : Exception(1, throwerSays) {};
};
void innercall {
<do stuff>
throw Derived("Bad things happened!");
}
void outercall {
try {
innercall();
}
catch(Exception& e)
{
printf("Exception seen here! %s %d\n", __FILE__, __LINE__);
throw e;
}
}
バグはもちろん、outercall が Derived ではなく Exception をスローしてしまうことでした。私のバグは、Derived の失敗をキャッチしようとするコール スタックの試行回数が多いことが原因でした。
ここで、理解していることを確認したいだけです。「throw e」行で、デフォルトのコピー コンストラクターを使用して、新しい Exception オブジェクトが作成されていると思います。それは本当に起こっていることですか?
その場合、スローされるオブジェクトのコピー コンストラクターをロックアウトできますか? これが二度と起こらないことを本当に望んでおり、私たちのコードには Exception オブジェクトをコピーする理由がありません (私が知っていることです)。
独自の例外階層があるという事実についてはコメントしないでください。これは少し古い設計で、修正に取り組んでいます (順調に進んでいます。自家製の文字列クラスと、自家製のコンテナの多くを取り除きました)。
更新:明確にするために、質問をする前にバグを修正しました(「throw e」を「throw」に変更することにより)。何が起こっているかの確認を探していました。