これは私が必読だと思う例外に関する非常に包括的なガイドです:
例外とエラー処理-C ++ FAQまたはC ++ FAQ lite
一般的な経験則として、プログラムが外部を識別できる場合は例外をスローします実行を妨げる問題。サーバーからデータを受信し、そのデータが無効な場合は、例外をスローします。ディスク容量が不足していますか?例外をスローします。宇宙線はあなたがデータベースに問い合わせることを妨げますか?例外をスローします。ただし、独自のプログラム内から無効なデータを取得した場合でも、例外をスローしないでください。問題が自分の悪いコードに起因する場合は、ASSERTを使用してそれを防ぐことをお勧めします。例外処理は、プログラムが処理できない問題を特定し、ユーザーが処理できるため、ユーザーについて通知するために必要です。ただし、プログラムのバグはユーザーが処理できるものではないため、プログラムがクラッシュすると、「answer_to_life_and_universe_and_everythingの値は42ではありません!これは決して発生しないはずです!!!! 11」という例外が発生します。
メッセージボックスを表示するなど、何か便利なことができる例外をキャッチします。どういうわけかユーザー入力を処理する関数内で一度例外をキャッチすることを好みます。たとえば、ユーザーが「すべてのhunamを全滅させる」ボタンを押すと、annihilateAllHunamsClicked()関数内に、「できません」と言うtry ... catchブロックがあります。hunamkindの消滅は、数十の関数を呼び出す必要がある複雑な操作ですが、ユーザーにとってはアトミック操作であるため、1回のtry ... catchしかありません。ボタンを1回クリックするだけです。すべての関数の例外チェックは冗長で醜いです。
また、RAIIに精通すること、つまり、初期化されたすべてのデータが自動的に破棄されることを確認することはお勧めできません。そして、それはスタックで可能な限り初期化することで達成できます。ヒープで何かを初期化する必要がある場合は、ある種のスマートポインターを使用してください。例外がスローされると、スタックで初期化されたものはすべて自動的に破棄されます。Cスタイルのダムポインタを使用すると、例外がスローされたときにメモリリークが発生するリスクがあります。これは、例外時にクリーンアップする人がいないためです(Cスタイルのポインタをクラスのメンバーとして使用できますが、必ずデストラクタで世話をしました)。