[解決済み] 例外処理はいつ、どのように使うべきですか?
質問
例外処理について読んでいます。例外処理が何であるかについての情報を得ましたが、いくつかの質問があります。
- どのような場合に例外をスローするのですか?
- 例外を投げる代わりに、戻り値でエラーを示すことは可能ですか?
- try-catch ブロックですべての関数を保護すると、パフォーマンスが低下しませんか?
- 例外処理を使用するタイミングは?
- 私は、そのプロジェクトの一つ一つの関数がtry-catchブロックを含んでいる(つまり、関数全体の中のコードがtry-catchブロックで囲まれている)プロジェクトを見ました。これは良い習慣ですか?
- try-catch と __try __except の違いは何ですか?
どのように解決するのですか?
例外処理に関する包括的なガイドがありますので、ぜひお読みください。
例外とエラー処理 C++ FAQ または C++ FAQ lite
一般的な経験則として、プログラムが 外部 の問題を特定できる場合に例外を投げるのが一般的です。サーバーからデータを受信し、そのデータが無効である場合、例外を投げる。ディスク容量が不足していますか?例外を投げる。宇宙線の影響でデータベースへの問い合わせができない?例外を投げる。しかし、自分のプログラムの内部から無効なデータが送られてきても、例外を投げてはいけません。もし、あなたの問題があなた自身の悪いコードから来るのであれば、 ASSERT を使ってそれを防いだ方が良いでしょう。例外処理は、プログラムが処理できない問題を特定し、それをユーザに伝えるために必要なもので、ユーザはそれを処理することができるからです。しかし、あなたのプログラムのバグは、ユーザが処理できるものではないので、プログラムのクラッシュは、 "answer_to_life_and_universe_and_everythingの値は42ではありません!よりも少なくないことを伝えることになります。これは決して起こってはならない!!11"例外です。
メッセージボックスを表示するなど、何か役に立つことができる場所で例外をキャッチします。私は、ユーザー入力を何らかの形で処理する関数の内部で一度例外をキャッチすることを好みます。例えば、ユーザーがボタン "Annihilate all hunams" を押し、annihilateAllHunamsClicked() 関数の中に try...catch ブロックがあり、 "I can't" と言っているとします。人類滅亡は何十もの関数を呼び出す必要がある複雑な操作であるにもかかわらず、try...catchは1つだけです。なぜなら、ユーザーにとってそれはボタンを1回クリックするだけの原子的な操作だからです。すべての関数で例外チェックをすることは冗長であり、醜いことです。
また、RAIIに精通することはあまりお勧めできません。つまり、初期化されたデータはすべて自動的に破壊されることを確認することです。そしてそれは、できるだけ多くのものをスタック上で初期化し、ヒープ上で何かを初期化する必要があるときは、ある種のスマートポインタを使用することで達成できます。スタック上で初期化されたものは、例外が発生したときに自動的に破棄されます。C言語のダムポインタを使用すると、例外が発生したときにメモリリークが発生する危険性があります(もちろん、C言語のポインタをクラスのメンバとして使用することはできますが、デストラクタで処理されることを確認してください)。
関連
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] Pythonの関数が例外を投げるかどうかをテストするにはどうすればよいですか?
-
[解決済み] noexceptを本当に使うべきはいつですか?
-
[解決済み] なぜすべてのブロックを "try"-"catch "で包んではいけないのですか?
-
[解決済み】C#で例外をキャッチして再スローする理由とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない