私たちは例外クラスの階層を持っています - GenericException
クラスとそこから派生したいくつかのクラスがあります。 GenericException
は多型です。仮想デストラクタを持っています。複数のcatchブロックまたはdynamic_castを持つブロック?
ファイルシステムオブジェクトを操作するときにエラーを示すために派生クラスの1つがFileException
にスローされます。 FileException
にはGetErrorCode()
というコードが返され、実際に何が問題になったのかを示すコードが返されます。
階層は既に存在していますが、私はそれを変更することはできませんので、問題はありません。
例外は私たちが制御しないコードから投げられ、常に新しいというキーワードでスローされますので、ポインタでそれらを捕捉することができます。これはどちらでも問題ありません。
今や、文のセットがGenericException
から派生することが保証されている例外を生成する可能性がある状況があります。 FileException
との場合、エラー状況のタイプは「ファイルが見つかりません」です。何もしません。そうでなければ、エラーメッセージを表示したいと思います。
私は2つの選択肢がある - のいずれか:それはコードの重複を減らすので、私は最初のものを好む
} catch(FileException* e) {
if(fileException->GetErrorCode() != FileNotFound) {
ShowMessage(e);
}
delete e;
} catch(GenericException* e) {
ShowMessage(e);
delete e;
}
:
} catch(GenericException* e) {
FileException* fileException = dynamic_cast<FileException*>(e);
if(fileException == 0 || fileException->GetErrorCode() != FileNotFound) {
ShowMessage(e);
}
delete e;
}
またはこのいずれかを。しかし、私はC++が選択的キャッチブロック(2番目のオプションのような)を許可しているので、私はdynamic_cast
を使用してはいけないという意見を聞いたことがある - 選択的キャッチブロックはそれを必要としない。
どちらのオプションが優れていますか?ここで最初のオプションがない理由は何でしょうか?
少なくとも、新しい例外が実行できなかった場合に備えて、どこでもcatch(bad_alloc&)ブロックが必要です。 – Pieter
そして、彼はそのようなブロックで何をしますか? –