- ベストアンサー
“try/catch”と“if/else”
プログラミング超初心者です。 以前、この掲示板でtry/catchとはどんなもので、どういう処理のときに使うものなのかという質問をさせていただいたのですが、そのときに ・if/elseは、ファイルが存在しないとか、ユーザーが許容範囲を越える文字列を入力したなどの『予測可能』な場合に使う ・try/catchは、データベースとの接続が途中で切断されるなどの『予測不可能』な場合に使う ということを教えていただいたのですが、『予測可能』と『予測不可能』の境目がわかっていません。 そこで ・具体的に、この処理のときは普通はtry/catchを使う というような処理を教えていただけないでしょうか? また、そのようなことが記載されているサイトなんかも教えていただければうれしいです。 私が周囲の人から聞いたのは、「COM、またはRPCなどの通信系の処理にはtry/catchを使う」らしいのですが、根拠がいまいちよくわかっていません。 Googleなどで調べてみてもそれらしい答えがないもので・・・。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
条件判断である if() と、例外処理である try/chtch は本来全く別のものです。 それは、本質的な処理における「条件分岐」なのか、本質的な処理でない部分の「例外」なのかの差です。 ですから、具体的な事例というよりは、プログラム設計時の設計思想に関わってきます。 「ファイルが存在しない」というのを、 1)ファイル名を指定する 2)そのファイルが存在しているかどうかチェックする 3)ファイルが存在しない時には、ファイル名の再入力を求める という場合は、「本質的な処理における分岐」 1)ファイル名を指定する 2)指定されたファイルからデータを読み込む 3)... ※ファイルが存在しない時には、あらかじめ設定されたファイルに差し替えること であれば、「例外処理」 ただ、ひとついえるのは、「例外処理」は、(例外なだけに)、リカバリ処理を、通常の処理の流れの中に自然に埋め込むのは、かなり面倒です。 どちらかといえば、例外事項が発生した時に、リカバリ処理が、(あらかじめ設定されているデータに差し替えるなど)プログラム側である程度強引に処理できるものは、構造的に例外処理で組み立てる方が簡単ではあります。 これは、(例の中にも示してありますが) ・ファイルが存在しなかった時に、ファイル名の再入力を求める(もちろん、その後、通常の処理に復帰する) ・ファイルが存在しなかったら、あらかじめ設定されたデータを読み込んだことにしてしまう の、それぞれを例外処理で組み立ててみると、構造的にどちらが例外処理になじみやすいかは、実感できると思います。
その他の回答 (3)
- jacta
- ベストアンサー率26% (845/3158)
C++の例外は、予測可能な事象についてしか使用できません。というのも、必ずどこかで明示的にthrow式を実行しなければならないからです。特定の処理系の非標準な拡張機能を除けば、プログラムの外部から非同期に予測不能な例外が引き起こされる可能性はないのです。 では、どんな場合に例外を使うかですが、 1. 例外を使わなければエラーを通知できない場合。 たとえば、コンストラクタの中で発生したエラーとか、多重定義された演算子で発生したエラーなどです。 2. 階層の深い部分や再帰処理から、一気に戻りたい場合。 一段ずつエラーコードを返しても構いませんが、コードの可読性が大幅に低下する場合が多々あります。 3. 致命傷かそれに近い場合。 その例外が発生した場合には、再起動かそれに近い対応が必要になります。 逆に、例外を使うべきでないのは、 1. リアルタイム処理やタイムクリティカルな処理の中で。 2. ユーザーによる不正な入力など、普通に起こりうる事象に対して。 3. デストラクタなど、リソースの解放時。 かなり乱暴な分類ですが、大体こんな感じです。 もちろん、状況によってはこの限りではありません。
- koedame
- ベストアンサー率33% (10/30)
まあ、私もそれなりに初心者ですが、 変数、ここでは int nBox; にしましょう。 このnBox は宣言しただけで、中には86409864 みたいなわけのわからない数字が入っています。 まあ、空みたいなものです。でも0(ゼロ)ではない。 つまりこの変数は if では判定できないのです。 中身が変だから。判定できないから。というわけです。 こういうのに try/chach を使用するのです。 まとめると if はしっかりした数字又は文字等が確認できれば使用できる。 try/chatch は読み取り出来ないものに使用するもの。 ・・・・だと思います。違っていたら申し訳ないです。
- chie65536
- ベストアンサー率41% (2512/6032)
実はもっと単純。 ・if/elseを使う場合 何らかの関数を用いて判定する事により、例外が起きる状態を回避でき、最初で例外が起きないと判ったら最後まで起きないとの保証がある場合。 ・try/catchを使う場合 何らかの関数を用いて判定しようと思うと、判定する行為そのもので例外が発生してしまうとか、最初は大丈夫で途中まで正しくアクセス出来ていてもアクセスしている最中に回線強制切断などの例外が起きる等、外部に起因する状態変化が起きる場合。 ぶっちゃけ「ifで判定不可能で、赤×の例外が出ちゃう時、赤×の例外が出ちゃう可能性のある時」に使用する。 但し「例外が出ても、そのまま強制終了してもOKで、メモリを開放するとか作業用ファイルを消すとかの後始末などが不要な時」はtry/catchを使わない事もある。 ・例外とは ダイアログウィンドウに赤い×印と一緒に出る「一般保護例外」などの事 普通、予測しない場面でプログラムに非同期で発生する。