- ベストアンサー
C#の例外の重複・改
- DecoratorパターンやProxyパターンでの例外の重複について質問します。
- メソッドAとメソッドBで同じ例外のチェックを行う意味はあるのか検討しています。
- Javaの標準ライブラリでは問題視されている場合もありますが、C#では問題ないのか知りたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
メソッドのContractなのだから行うべきかと。 自身の処理の一つとしてのpre-conditionのチェックという位置づけになります。 つまり,動作が変化する等の理由では無く,メソッドの自己記述の完結性が理由です。 他には,CodeContracts使って Contracts.Requires<ArgumentOutOfRangeException>(!valに関する条件A); とすることもあるかと。 これには,Code Contracts EditorがMethodAでもContractを拾ってくれる,という効果もあります。 さらに,これがinterfaceの同一メソッドであれば,interface自体のContractですので, そちらのContractClassに条件を書いてしまい,実装側にはContractを書かない,という解もあります。 # CodeContractsのRewriterが両方に書いてくれます。
その他の回答 (2)
- nak777r
- ベストアンサー率36% (49/136)
ステップ実行して、確認すればわかりませんか? Aのパターンをステップ実行してみる Bのパターンをステップ実行してみる Aのパターンの例外処理が行われるような処理をしてみる Bのパターンの例外処理が行われるような処理をしてみる Aのパターンで例外処理を行っている、 Bのパターンで、Aの例外処理はおこなわれるの? 的な疑問はステップ実行するだけで判るでしょ それらをやった上で、例外が必要なら、例外にさせない 方法を共通化できないかを考えて見ればいいのではないですか Aのパターン、Bのパターンで例外にならないための チェック関数を作成してそれぞれの関数内で呼ぶとか 関数をコールする前にチェックするとか
お礼
回答ありがとうございます。 > ステップ実行して、確認すればわかりませんか? ステップインは結構使っています(というか、ステップオーバーするところまで間違えてインいてしまって、深くなりすぎて面倒になったり……)。 MethodA(かそのクラス)に[System.Diagnostics.DebuggerStepThrough]を付けたらどちらにせよ、外部からは(ステップインしようとしてもできないので)MethodAが例外を吐いているように見えると思ったので、別にMethodAにチェックをつけなくてもいいかと思ったのですが…間違いでしょうか?
- wormhole
- ベストアンサー率28% (1626/5665)
なんのために > if ( valに関する条件A ) > throw new ArgumentOutOfRangeException("val"); のチェックを行ってるかによるのではないでしょうか。 MethodB()を呼び出す前の事前チェックというだけなら意味はないでしょうし、 MethodB()より後の処理のためのチェック処理なら意味はあると思いますし。
お礼
回答ありがとうございました。 なるほど。それもそうですね。 チェックを他のメソッド任せにするのはそのメソッドが何らかの変更が加えられたり、(普通ないと思いますが、どこかで下位クラス代入されてたりして)オーバーライドされ、条件がゆるくなったメソッドが呼び出されたら大変ですよね。
お礼
いつもいつも回答ありがとうございます。 Contractですか。調べたところ、リライターで取り除くので実行速度は影響されないとか何とかありましたが、今度挑戦してみることにします。 とりあえず、チェックを契約と見なすと行うべきということですね。貴重なご意見、ありがとうございました。