しょーもない質問だと思いますが。
C++で趣味でやっています。
他の方の 別の言語 ( Pythonだったかな? ) の質問 ( 確か エラー処理に関しての質問だった気が... ) に回答したときに
別の方 ( 質問者さん以外 ) から「それはレガシーな方法ですね。モダンなやり方は"例外を投げること"です...」 というようなご指摘を受けました。
( どのページだったか忘れましたが... )
何らかのエラーのとき例外を投げるっていうのはわかります。
ですが、その例外の影響力が微々たるものである場合はどうなんでしょうか?
例えば C++ & Windows API で GUI ( -mwindows でやる方 ) を作成するとします。
CreateWindowInstance関数なるもの ( 自作関数 ) で メインウィンドウ用のクラスオブジェクト ( 自作クラスから生成。 ) を生成して返すとします。
メモリ不足とかなら「処理続行 不可能」なので
- iniファイルからデータを読み込む -> 構造体 WININFO (自作) に格納
- WININFO をもとに インスタンス化
- 生成したオブジェクトを返す
という流れだとします。
iniファイルがないとか、存在はするけど 指定のセクションやキーがないとかで取得失敗した場合はどうすればいいでしょうか?
例外を投げるのはいいですが、
大雑把な CreateWindowInstanceを書くと ( WMainWindow をメインウィンドウのクラスとして。CExceptionEx は std::exceptionを継承した例外クラスだとします。 )
C++
1WININFO CreateWindowInfo( void ) throw(CExceptionEx){ 2 // ここでiniファイルを読み込んでWININFOを返す。もし存在しないなら例外を投げる。 3} 4 5 6WMainWindow* CreateWindowInstance( void ){ 7 WMainWindow* MainWindow; 8 9 try{ 10 11 WININFO wi; 12 13 wi = CreateWindowInfo(); // ここで例外が投げられる可能性あり 14 15 // ここで WININFO wi をもとに WMainWindow を構築する 16 17 // それ以外の何らかの処理? 18 19 }catch( CExceptionEx &e ){ 20 ... 21 }catch( 例外2 ){ 22 ... 23 } 24return MainWindow; 25}
となるとします。 (あくまでイメージです。)
関数, メンバ関数 ( メソッドとも。 ) の戻り値は 処理結果に集中すべきで、完了した・失敗した等は例外を投げることで明示すべきである
というのは理解できます。
しかし、上記の例の場合、もし iniファイルがないなら例外が投げられて catch以降に行くので "// ここでWININFO wi をもとに..." の部分以降は無視されますよね。
つまり iniファイルがある前提です。確かにiniファイルそのものはそこまで重くないので用意しておけばいいかもしれませんが、
これを任意にすることはできないのでしょうか?
例えば
iniファイルがない等で取得できなかった場合 -> 実行ファイルが指定するデータで行う
〃 できた場合 -> そのデータで行う
例:
main.ini から 背景色が取得できなかった場合は 背景色を "黒" とする
取得できた場合はその色とする
という感じにしたいのですが。
もし上記のソースコード風のやつだと iniファイルがない ( または セクションがない or キーがない ) ためにデータを取得できないなら生成不可。
となってしまいます。
一応 goto を使うことを思いつきましたが、goto は使いすぎるとスパゲッティになるので非推奨ですよね...
こういう任意のやつも例外として投げないといけないのでしょうか?
それとも「続行不可」な場合だけでしょうか?
くだらないかもしれませんがお願いします。
[情報]
言語: C++ ( Better C というやつ )
宜しくお願い致します。
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。