プログラミング超初心者です。
以前、この掲示板でtry/catchとはどんなもので、どういう処理のときに使うものなのかという質問をさせていただいたのですが、そのときに
・if/elseは、ファイルが存在しないとか、ユーザーが許容範囲を越える文字列を入力したなどの『予測可能』な場合に使う
・try/catchは、データベースとの接続が途中で切断されるなどの『予測不可能』な場合に使う
ということを教えていただいたのですが、『予測可能』と『予測不可能』の境目がわかっていません。
そこで
・具体的に、この処理のときは普通はtry/catchを使う
というような処理を教えていただけないでしょうか?
また、そのようなことが記載されているサイトなんかも教えていただければうれしいです。
私が周囲の人から聞いたのは、「COM、またはRPCなどの通信系の処理にはtry/catchを使う」らしいのですが、根拠がいまいちよくわかっていません。
Googleなどで調べてみてもそれらしい答えがないもので・・・。
よろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
条件判断である if() と、例外処理である try/chtch は本来全く別のものです。
それは、本質的な処理における「条件分岐」なのか、本質的な処理でない部分の「例外」なのかの差です。
ですから、具体的な事例というよりは、プログラム設計時の設計思想に関わってきます。
「ファイルが存在しない」というのを、
1)ファイル名を指定する
2)そのファイルが存在しているかどうかチェックする
3)ファイルが存在しない時には、ファイル名の再入力を求める
という場合は、「本質的な処理における分岐」
1)ファイル名を指定する
2)指定されたファイルからデータを読み込む
3)...
※ファイルが存在しない時には、あらかじめ設定されたファイルに差し替えること
であれば、「例外処理」
ただ、ひとついえるのは、「例外処理」は、(例外なだけに)、リカバリ処理を、通常の処理の流れの中に自然に埋め込むのは、かなり面倒です。
どちらかといえば、例外事項が発生した時に、リカバリ処理が、(あらかじめ設定されているデータに差し替えるなど)プログラム側である程度強引に処理できるものは、構造的に例外処理で組み立てる方が簡単ではあります。
これは、(例の中にも示してありますが)
・ファイルが存在しなかった時に、ファイル名の再入力を求める(もちろん、その後、通常の処理に復帰する)
・ファイルが存在しなかったら、あらかじめ設定されたデータを読み込んだことにしてしまう
の、それぞれを例外処理で組み立ててみると、構造的にどちらが例外処理になじみやすいかは、実感できると思います。
No.3
- 回答日時:
C++の例外は、予測可能な事象についてしか使用できません。
というのも、必ずどこかで明示的にthrow式を実行しなければならないからです。特定の処理系の非標準な拡張機能を除けば、プログラムの外部から非同期に予測不能な例外が引き起こされる可能性はないのです。では、どんな場合に例外を使うかですが、
1. 例外を使わなければエラーを通知できない場合。
たとえば、コンストラクタの中で発生したエラーとか、多重定義された演算子で発生したエラーなどです。
2. 階層の深い部分や再帰処理から、一気に戻りたい場合。
一段ずつエラーコードを返しても構いませんが、コードの可読性が大幅に低下する場合が多々あります。
3. 致命傷かそれに近い場合。
その例外が発生した場合には、再起動かそれに近い対応が必要になります。
逆に、例外を使うべきでないのは、
1. リアルタイム処理やタイムクリティカルな処理の中で。
2. ユーザーによる不正な入力など、普通に起こりうる事象に対して。
3. デストラクタなど、リソースの解放時。
かなり乱暴な分類ですが、大体こんな感じです。
もちろん、状況によってはこの限りではありません。
No.2
- 回答日時:
まあ、私もそれなりに初心者ですが、
変数、ここでは
int nBox;
にしましょう。
このnBox は宣言しただけで、中には86409864
みたいなわけのわからない数字が入っています。
まあ、空みたいなものです。でも0(ゼロ)ではない。
つまりこの変数は
if では判定できないのです。
中身が変だから。判定できないから。というわけです。
こういうのに
try/chach を使用するのです。
まとめると
if はしっかりした数字又は文字等が確認できれば使用できる。
try/chatch は読み取り出来ないものに使用するもの。
・・・・だと思います。違っていたら申し訳ないです。
No.1
- 回答日時:
実はもっと単純。
・if/elseを使う場合
何らかの関数を用いて判定する事により、例外が起きる状態を回避でき、最初で例外が起きないと判ったら最後まで起きないとの保証がある場合。
・try/catchを使う場合
何らかの関数を用いて判定しようと思うと、判定する行為そのもので例外が発生してしまうとか、最初は大丈夫で途中まで正しくアクセス出来ていてもアクセスしている最中に回線強制切断などの例外が起きる等、外部に起因する状態変化が起きる場合。
ぶっちゃけ「ifで判定不可能で、赤×の例外が出ちゃう時、赤×の例外が出ちゃう可能性のある時」に使用する。
但し「例外が出ても、そのまま強制終了してもOKで、メモリを開放するとか作業用ファイルを消すとかの後始末などが不要な時」はtry/catchを使わない事もある。
・例外とは
ダイアログウィンドウに赤い×印と一緒に出る「一般保護例外」などの事
普通、予測しない場面でプログラムに非同期で発生する。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
高校生はアルバイトするべきだろうか?賛成だったら「賛」、否定だったら「否」を文頭においてあなたの意見を教えてください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
例外ってIf文の中に入れますか?If文の外でTry...Catchしますか??
Visual Basic(VBA)
-
デバッグとビルドは何が違うのですか?
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル VBAで複数セル選択時...
-
【C#/Java?】try-catchでcatch...
-
特定の名前のオートシェイプの...
-
VBA 複数の行を高速で削除する...
-
ListViewから選択中の文字列を取得
-
【Vb.net】プリンタジョブの取得
-
VBA Vlookup #N/A表示させない方法
-
RaiseEventのメリット
-
IF文に時間(何時から何時ま...
-
vbaのエラー対応(実行時エラー...
-
StatusStripの表示が更新されな...
-
どう増強すべきか
-
ExcelのVBAで、選択したファイ...
-
シグナル 6(SIGABRT)とは?
-
ProgressBarを用いる場合、全体...
-
winsockの非同期処理について
-
C++ Builder6.0 TNMFTPコンポー...
-
【C#】Page_Loadさせない方法に...
-
複数個のTextBoxでいずれかの内...
-
Functionで戻り値を複数返す方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
IF文に時間(何時から何時ま...
-
private subモジュールを他のモ...
-
vbaのエラー対応(実行時エラー...
-
シグナル 6(SIGABRT)とは?
-
マクロで、次のコードへ行く前...
-
どう増強すべきか
-
Excel VBA セルの名前があるか...
-
特定の名前のオートシェイプの...
-
どうやってもFor文を抜けてしま...
-
特定のファイルを他のプロセス...
-
ExcelのVBAで、選択したファイ...
-
VB6にてネットワーク上にある共...
-
VBA 複数の行を高速で削除する...
-
Word VBA。各マクロの間に待ち...
-
フォルダのアクセス権確認について
-
エクセル VBAで複数セル選択時...
-
VBA For Each 〜 複数条件について
-
【C#】Page_Loadさせない方法に...
-
StatusStripの表示が更新されな...
おすすめ情報