

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で質問しましょう!
似たような質問が見つかりました
- Java すみません。助けてください。 javaについての質問です。 integerに変換できない数値をエラー 5 2022/05/18 19:16
- Java Javaのソースコード作成が難しいです... 10 2022/11/11 14:06
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- 英語 "Try not"と"Don't try"の違い等について 9 2022/12/14 11:45
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- 英語 to不定詞は、to不定詞を目的語にできますか? 1 2022/05/11 14:36
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- 英語 【英語】 I try to speak English I try speaking English 3 2022/08/25 00:20
- オープンソース Try Kotlinで readLine()を使うには 1 2023/03/27 21:06
- JavaScript 初心者です。gulpでコンパイルができないので教えてください! 1 2023/05/17 17:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VBA】ワークブックを開く時に...
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
String""から型'Double'への変...
-
VBAでfunctionを利用しようとし...
-
マクロで"#N/A"のエラー行を削...
-
マクロOn Error GoTo ErrLabel...
-
VBA データ(特定値)のある最...
-
VB.net 重複チェックがしたいです
-
インポート時のエラー「データ...
-
ADOのExecuteメソッドで交互に...
-
On ErrorでエラーNoが0
-
Filter関数を用いた結果、何も...
-
VBScriptのCreateFolderについて
-
助けてください
-
Excel vbaについての質問
-
レコード登録時に「演算子があ...
-
オブジェクト型の変数にフォー...
-
演算子が DBnull 及び integer...
-
VBA Find でオートメーションエ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
String""から型'Double'への変...
-
【VBA】ワークブックを開く時に...
-
文字列内で括弧を使うには
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
ApplicationとWorksheetFunctio...
-
【Access】Excelインポート時に...
-
インポート時のエラー「データ...
-
実行時エラー 438 の解決策をお...
-
オブジェクト型の変数にフォー...
-
.VBSだとADODBのプロバイダが見...
-
実行時エラー'-2147467259(8000...
-
【VB.NET】 パワポ操作を非表示で
-
フランスの生年月日(jj/mm/aaaa)
-
【VBAエラー】Nextに対するFor...
おすすめ情報