C++ コードを例外セーフにしようとしていますが、友人に尋ねたり Web を検索したりしても解決しないという問題が発生しました。
私の理解では、コンストラクターでオブジェクトを作成すると例外がスローされる可能性があるため、作成するためのコードをtry
ブロックで囲む必要があり、例外処理は で行われcatch(){}
ます。
作成がヒープベースの場合 (たとえばnew
、デフォルトのアロケーターを使用)、次のように作成の近くに例外処理コードを配置できます。
void f() {
// work unrelated to Hoge object here
try {
Hoge *pHoge = new Hoge(); // could throw an exception
} catch(HogeException& ex) {
// handle exception
}
// rest of work here
}
try
ただし、作成がスタックベースの場合、ブロックのスコープのために、それを行う方法が見つからず、以下のようなコードに頼ることができません。
void g() {
// work unrelated to Hoge object here
try {
Hoge hoge; // could throw an exception
// rest of work here
} catch(HogeException& ex) {
// handle exception
}
}
上記// rest of work
のコードが大きい場合、オブジェクトの作成と例外処理の間の距離が長くなり、コードの可読性が低下する可能性があります...
私は、例外処理コードがオブジェクト作成の近くにあることを好みます (おそらくそれは構造の概念の 1 つですtry
) catch
。解決策はありますか?