• ベストアンサー

try catchは避けるべき?

C++の質問ですが、 gotoレスは当たり前として(C++に限ったことではないですが)、 try catchもやっぱり避けるべきですか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

C++ の例外機能の使い方が時として問題になるのは、エラーの発生点(through した点)とエラーを補足した点(catch した点)が離れているからです。 一方、例外処理の思想自体が、 ・エラーの発生点は、具体的なエラーの内容はわかるが、修復方法はわからない。 (srqt() の引数が、-1 だったらエラーだというのは、sqrt() の中ではわかるが、どうして -1 が来たのか、どう回復したらいいのかはわかない) ・エラーの補足点は、具体的なエラーの内容はわからないが、エラーの原因や対処方法は知っている (sqrt() の引数が「範囲外」だったら、入力されたデータがおかしい。だから、もう一度入力をしてもらおう) という、発生点と補足点の距離をふまえて適切に処理を仕様というところから来ています。 なので、「例外処理の思想」にはずれないように、発生点の役割と、補足点の役割が把握できている限り問題はありません。 逆に、「エラーが起こったら、とりあえず例外処理」という発想だと、設計が破綻することが多いですね。 goto レスにしても、今では「あたりまえ」ではありません。goto を使うべきところで、goto を回避するための「テクニック」を駆使すると、制御の流れがとても不自然になります。

karatekakarateka
質問者

お礼

ご回答ありがとうございます。 >・エラーの発生点は、具体的なエラーの内容はわかるが、修復方法はわからない。 (srqt() の引数が、-1 だったらエラーだというのは、sqrt() の中ではわかるが、どうして -1 が来たのか、どう回復したらいいのかはわかない) >・エラーの補足点は、具体的なエラーの内容はわからないが、エラーの原因や対処方法は知っている (sqrt() の引数が「範囲外」だったら、入力されたデータがおかしい。だから、もう一度入力をしてもらおう) とても分かり易い具体例、勉強になりました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

try/catch(正確には監視ブロック)は適切に使うべきという意見ばかりのようですので、監視ブロックを使わなければどうなるかについて、少し書いてみたいと思います。 まず、監視ブロックがどこにもなければ、送出された例外は捕捉されませんので、std::teminate()が呼び出されます。これはエラー処理を放棄したのと同じ意味になります。 また、監視ブロックを使わなければ、例外処理にまつわるオーバーヘッドがないかというと、そんなことはありません。例外指定 throw() がない関数を、デストラクタを持つ自動オブジェクトの生存期間で呼び出した場合には、処理系にもよりますが、巻き戻し用のコードがどっさり生成されます(遅くて大きくなります)。 例外処理のオーバーヘッドをなくすには、コンパイルオプションで例外処理を抑止するのが一番ですが、その状態でライブラリが例外を送出した場合は、何が起こるか全くわからなくなり、信頼性の高いソフトウェアを実装することは不可能です。

karatekakarateka
質問者

お礼

ご回答ありがとうございます。 >例外処理のオーバーヘッドをなくすには、コンパイルオプションで例外処理を抑止するのが一番ですが、その状態でライブラリが例外を送出した場合は、何が起こるか全くわからなくなり、信頼性の高いソフトウェアを実装することは不可能です。 確かにそうですね。試験工程でいつも痛い目にあっています。

すると、全ての回答が全文表示されます。
  • rigidbody
  • ベストアンサー率60% (20/33)
回答No.4

いいえ。そんな事はないと思いますよ。 使うか否かは、状況により変わると思います。 【長所】 ・厳格できめ細かなエラー処理が、少ないコードで実現できる 【短所】 ・遅くなる可能性がある きちんと使えば、エラー処理コードが凄く単純化されます。こういう機能を持たない言語で同様のエラー処理をする事は、恐らくできないと思います。 が、私は極力避けています。何故なら"エラー処理の価値が低い分野のソフトを扱っている為"です。 その代わりエラーは、大量のアサーションコードで捕まえるようにしています。 More Effective C++という本に、エラーハンドリングコードのオーバーヘッドについて詳細が書かれています。 私はそれを鵜呑みにしている、って感じです。

karatekakarateka
質問者

お礼

ご回答ありがとうございます。 >エラーは、大量のアサーションコードで捕まえるようにしています。 設計工程がしっかりしていれば、確かに速度で優れるかもしれませんね。

すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

gotoもtry/catchも使うべきところで適切に使うべきものです。下手糞な使い方が問題になるのは、ifでもforでも同じです。 ところで、try/catchを使わなければ例外処理と無縁でいられるかというと決してそんなことはありません。 C++を使う場合には、常に例外と隣り合わせであることを認識すべきです。

すると、全ての回答が全文表示されます。
  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.1

C++の原則は 「エラーの通知には例外を使おう」 だと思います。 よってエラー発生を検出するためにtry catchを使うのは問題ないでしょう。 ところでgotoも、使ってはいけないものではなく、場所をわきまえれば使って良いと思いますよ。

karatekakarateka
質問者

お礼

ご回答ありがとうございます。 >「エラーの通知には例外を使おう」 なるほど、勉強になりました。

すると、全ての回答が全文表示されます。

関連するQ&A