

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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
String""から型'Double'への変...
-
お助けください!VBAのファイル...
-
エクセルVBAで埋め込みグラフ(C...
-
【VBA】ワークブックを開く時に...
-
LaTeXのエラーについて(コンパ...
-
HTMLソースが表示のページのも...
-
mailstorehomeのエクスポートで...
-
VBAでfunctionを利用しようとし...
-
ApplicationとWorksheetFunctio...
-
オートシェイプの削除時のエラ...
-
Excel vbaについての質問
-
COMExceptionはハンドルされま...
-
CreateFontが文法エラーに
-
unityの教科書のゲームを作って...
-
フランスの生年月日(jj/mm/aaaa)
-
データベース操作時エラーについて
-
ISAMドライバー
-
VC++で作成したソフトを実行す...
-
ADO 「認証に失敗しました」
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
マクロで"#N/A"のエラー行を削...
-
文字列内で括弧を使うには
-
String""から型'Double'への変...
-
【Access】Excelインポート時に...
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
インポート時のエラー「データ...
-
ACCESSで値を代入できないとは?
-
VBA エクセル で FIND でのエラ...
-
Filter関数を用いた結果、何も...
-
レコード登録時に「演算子があ...
-
ApplicationとWorksheetFunctio...
-
Excel vbaについての質問
-
【VBAエラー】Nextに対するFor...
-
実行時エラー 438 の解決策をお...
-
「実行時エラー '3167' レコー...
おすすめ情報