1. ホーム
  2. c++

[解決済み] 例外処理はいつ、どのように使うべきですか?

2023-04-29 19:50:47

質問

例外処理について読んでいます。例外処理が何であるかについての情報を得ましたが、いくつかの質問があります。

  1. どのような場合に例外をスローするのですか?
  2. 例外を投げる代わりに、戻り値でエラーを示すことは可能ですか?
  3. try-catch ブロックですべての関数を保護すると、パフォーマンスが低下しませんか?
  4. 例外処理を使用するタイミングは?
  5. 私は、そのプロジェクトの一つ一つの関数がtry-catchブロックを含んでいる(つまり、関数全体の中のコードがtry-catchブロックで囲まれている)プロジェクトを見ました。これは良い習慣ですか?
  6. 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言語のポインタをクラスのメンバとして使用することはできますが、デストラクタで処理されることを確認してください)。