No.3ベストアンサー
- 回答日時:
C++ の例外機能の使い方が時として問題になるのは、エラーの発生点(through した点)とエラーを補足した点(catch した点)が離れているからです。
一方、例外処理の思想自体が、
・エラーの発生点は、具体的なエラーの内容はわかるが、修復方法はわからない。
(srqt() の引数が、-1 だったらエラーだというのは、sqrt() の中ではわかるが、どうして -1 が来たのか、どう回復したらいいのかはわかない)
・エラーの補足点は、具体的なエラーの内容はわからないが、エラーの原因や対処方法は知っている
(sqrt() の引数が「範囲外」だったら、入力されたデータがおかしい。だから、もう一度入力をしてもらおう)
という、発生点と補足点の距離をふまえて適切に処理を仕様というところから来ています。
なので、「例外処理の思想」にはずれないように、発生点の役割と、補足点の役割が把握できている限り問題はありません。
逆に、「エラーが起こったら、とりあえず例外処理」という発想だと、設計が破綻することが多いですね。
goto レスにしても、今では「あたりまえ」ではありません。goto を使うべきところで、goto を回避するための「テクニック」を駆使すると、制御の流れがとても不自然になります。
ご回答ありがとうございます。
>・エラーの発生点は、具体的なエラーの内容はわかるが、修復方法はわからない。
(srqt() の引数が、-1 だったらエラーだというのは、sqrt() の中ではわかるが、どうして -1 が来たのか、どう回復したらいいのかはわかない)
>・エラーの補足点は、具体的なエラーの内容はわからないが、エラーの原因や対処方法は知っている
(sqrt() の引数が「範囲外」だったら、入力されたデータがおかしい。だから、もう一度入力をしてもらおう)
とても分かり易い具体例、勉強になりました。
No.5
- 回答日時:
try/catch(正確には監視ブロック)は適切に使うべきという意見ばかりのようですので、監視ブロックを使わなければどうなるかについて、少し書いてみたいと思います。
まず、監視ブロックがどこにもなければ、送出された例外は捕捉されませんので、std::teminate()が呼び出されます。これはエラー処理を放棄したのと同じ意味になります。
また、監視ブロックを使わなければ、例外処理にまつわるオーバーヘッドがないかというと、そんなことはありません。例外指定 throw() がない関数を、デストラクタを持つ自動オブジェクトの生存期間で呼び出した場合には、処理系にもよりますが、巻き戻し用のコードがどっさり生成されます(遅くて大きくなります)。
例外処理のオーバーヘッドをなくすには、コンパイルオプションで例外処理を抑止するのが一番ですが、その状態でライブラリが例外を送出した場合は、何が起こるか全くわからなくなり、信頼性の高いソフトウェアを実装することは不可能です。
ご回答ありがとうございます。
>例外処理のオーバーヘッドをなくすには、コンパイルオプションで例外処理を抑止するのが一番ですが、その状態でライブラリが例外を送出した場合は、何が起こるか全くわからなくなり、信頼性の高いソフトウェアを実装することは不可能です。
確かにそうですね。試験工程でいつも痛い目にあっています。
No.4
- 回答日時:
いいえ。
そんな事はないと思いますよ。使うか否かは、状況により変わると思います。
【長所】
・厳格できめ細かなエラー処理が、少ないコードで実現できる
【短所】
・遅くなる可能性がある
きちんと使えば、エラー処理コードが凄く単純化されます。こういう機能を持たない言語で同様のエラー処理をする事は、恐らくできないと思います。
が、私は極力避けています。何故なら"エラー処理の価値が低い分野のソフトを扱っている為"です。
その代わりエラーは、大量のアサーションコードで捕まえるようにしています。
More Effective C++という本に、エラーハンドリングコードのオーバーヘッドについて詳細が書かれています。
私はそれを鵜呑みにしている、って感じです。
ご回答ありがとうございます。
>エラーは、大量のアサーションコードで捕まえるようにしています。
設計工程がしっかりしていれば、確かに速度で優れるかもしれませんね。
No.2
- 回答日時:
gotoもtry/catchも使うべきところで適切に使うべきものです。
下手糞な使い方が問題になるのは、ifでもforでも同じです。ところで、try/catchを使わなければ例外処理と無縁でいられるかというと決してそんなことはありません。
C++を使う場合には、常に例外と隣り合わせであることを認識すべきです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
実行時エラー 438 の解決策をお...
-
VBAでfunctionを利用しようとし...
-
String""から型'Double'への変...
-
ACCESSで値を代入できないとは?
-
文字列内で括弧を使うには
-
【VBAエラー】Nextに対するFor...
-
マクロで"#N/A"のエラー行を削...
-
VBA データ(特定値)のある最...
-
【VBA】ワークブックを開く時に...
-
VBScript でのformat
-
#N/Aの文字を削除するには
-
【VB.NET】 パワポ操作を非表示で
-
数式は残し値をクリアするマク...
-
.VBSだとADODBのプロバイダが見...
-
Excel VBA 複数ブックシートご...
-
エクセルVBAで埋め込みグラフ(C...
-
実行時エラー'-2147467259(8000...
-
VBA処理中に途中で止まってしま...
-
C#のwebBrowserについて質問します
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
VBAでfunctionを利用しようとし...
-
String""から型'Double'への変...
-
お助けください!VBAのファイル...
-
文字列内で括弧を使うには
-
On ErrorでエラーNoが0
-
【VBA】ワークブックを開く時に...
-
実行時エラー'-2147467259(8000...
-
マクロで"#N/A"のエラー行を削...
-
【VBAエラー】Nextに対するFor...
-
インポート時のエラー「データ...
-
Excel vbaについての質問
-
実行時エラー 438 の解決策をお...
-
「実行時エラー '3167' レコー...
-
【Access】Excelインポート時に...
-
VBA データ(特定値)のある最...
-
フランスの生年月日(jj/mm/aaaa)
-
Excel実行時エラー[80004005]に...
-
ACCESSで値を代入できないとは?
-
pythonのopenpyxlについて
おすすめ情報