• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:c# 例外の重複・改)

C#の例外の重複・改

このQ&Aのポイント
  • DecoratorパターンやProxyパターンでの例外の重複について質問します。
  • メソッドAとメソッドBで同じ例外のチェックを行う意味はあるのか検討しています。
  • Javaの標準ライブラリでは問題視されている場合もありますが、C#では問題ないのか知りたいです。

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

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

メソッドのContractなのだから行うべきかと。 自身の処理の一つとしてのpre-conditionのチェックという位置づけになります。 つまり,動作が変化する等の理由では無く,メソッドの自己記述の完結性が理由です。 他には,CodeContracts使って Contracts.Requires<ArgumentOutOfRangeException>(!valに関する条件A); とすることもあるかと。 これには,Code Contracts EditorがMethodAでもContractを拾ってくれる,という効果もあります。 さらに,これがinterfaceの同一メソッドであれば,interface自体のContractですので, そちらのContractClassに条件を書いてしまい,実装側にはContractを書かない,という解もあります。 # CodeContractsのRewriterが両方に書いてくれます。

koumei000
質問者

お礼

 いつもいつも回答ありがとうございます。  Contractですか。調べたところ、リライターで取り除くので実行速度は影響されないとか何とかありましたが、今度挑戦してみることにします。  とりあえず、チェックを契約と見なすと行うべきということですね。貴重なご意見、ありがとうございました。

その他の回答 (2)

  • nak777r
  • ベストアンサー率36% (49/136)
回答No.2

ステップ実行して、確認すればわかりませんか? Aのパターンをステップ実行してみる Bのパターンをステップ実行してみる Aのパターンの例外処理が行われるような処理をしてみる Bのパターンの例外処理が行われるような処理をしてみる Aのパターンで例外処理を行っている、 Bのパターンで、Aの例外処理はおこなわれるの? 的な疑問はステップ実行するだけで判るでしょ それらをやった上で、例外が必要なら、例外にさせない 方法を共通化できないかを考えて見ればいいのではないですか Aのパターン、Bのパターンで例外にならないための チェック関数を作成してそれぞれの関数内で呼ぶとか 関数をコールする前にチェックするとか

koumei000
質問者

お礼

 回答ありがとうございます。 > ステップ実行して、確認すればわかりませんか?  ステップインは結構使っています(というか、ステップオーバーするところまで間違えてインいてしまって、深くなりすぎて面倒になったり……)。  MethodA(かそのクラス)に[System.Diagnostics.DebuggerStepThrough]を付けたらどちらにせよ、外部からは(ステップインしようとしてもできないので)MethodAが例外を吐いているように見えると思ったので、別にMethodAにチェックをつけなくてもいいかと思ったのですが…間違いでしょうか?

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

なんのために >  if ( valに関する条件A ) >    throw new ArgumentOutOfRangeException("val"); のチェックを行ってるかによるのではないでしょうか。 MethodB()を呼び出す前の事前チェックというだけなら意味はないでしょうし、 MethodB()より後の処理のためのチェック処理なら意味はあると思いますし。

koumei000
質問者

お礼

 回答ありがとうございました。    なるほど。それもそうですね。  チェックを他のメソッド任せにするのはそのメソッドが何らかの変更が加えられたり、(普通ないと思いますが、どこかで下位クラス代入されてたりして)オーバーライドされ、条件がゆるくなったメソッドが呼び出されたら大変ですよね。

関連するQ&A