• ベストアンサー
※ 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% (1622/5659)
回答No.1

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

koumei000
質問者

お礼

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

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

関連するQ&A

  • 例外処理について

    こんにちは。 とあるメソッドで例えば 「void openErrorFile(){」とあるのですが、 メソッド内部で } catch (Exception e) { throw new RuntimeException();} と例外をThrowしています。 この場合、メソッドの定義「openErrorFile()」にはThrows句を 付ける必要は無いのでしょうか?。 すみませんがご教授願います。

    • ベストアンサー
    • Java
  • C# マルチスレッドにおける例外処理

    下記のようなデリゲートを利用したマルチスレッドのプログラムを組みました。 しかし、マルチスレッド内で例外がおきても、正常にプログラムが終了してしまいます。 (try-catchでも例外を捕捉できません) マルチスレッドプログラムにおいて、例外を捕捉するにはどうすれば、いいのでしょうか? using System; using System.Threading; class Class1 { delegate void delg(); public static void Main() { delg d = new delg(multi); d.BeginInvoke(new AsyncCallback(call), null); //マルチスレッド開始 System.Threading.Thread.Sleep(500); //マルチスレッドで例外を強制的に投げているので、 //ここまでたどり着く前にアプリケーションが落ちるはず。 //しかし、実際には正常終了。 Console.WriteLine("メインメソッド 正常終了"); } public static void multi() { Console.WriteLine("マルチスレッドで実行中"); throw new Exception(); //例外を強制的に投げる。 } public static void call(IAsyncResult ar) { Console.WriteLine("コールバックメソッド実行"); } }

  • Javaの実装方法?Eclipse?ポリモルフィズム?

    Javaの実装方法はどうなのかの質問です。 Eclipseで解析しているのですが、解析は「宣言を開く」(F3)で進みながら解析しています。 以下のソースだと、yobidasiクラスのMethodXからMethodAにF3で飛ぶとOyaClassのMethodAにきます。 その後、MethodA内でMethodBにF3で飛ぶとOyaClassのMethodBに飛びます。 でも、実際の動きは、OyaClassではなくkoClassのMethodBに行きます。 この実装方法ってどうなのでしょうか?こういうものなのですか? 解析ミスに繋がらないかなと思っているんですが。 また、EclipseでkoClassに飛ばす方法はあるんでしょうか? 助言をください。 class yobidasi{  methodX{ koClass cls = new koClass; cls = methodA  } } public class koClass extends OyaClass{  protected methodB{  } } public class OyaClass {  public methodA{ methodB()  }  protected methodB{ //空メソッド  } }

  • c# 例外が重複する場合

     こんにちは。c#初心者です。  今回は例外に関する質問です。 ----------------------------------------------------- list1, list2を「System.Collections.Generic.List<int>」とします。 int GetValue(int index1, int index2) {   //*1   //とりあえず、何らかの計算を行う(この場合は掛け算)   return list1[index2] * list2[index2]; } -----------------------------------------------------  上記の場合、普通だったら引数の範囲のチェックが必要になると思うのですが、たまたまList<T>の既定の「0~Count - 1」の範囲とまったく同じだった場合、 一般化していえば、現在のメソッド(、プロパティ、インデクサ、コンストラクタ)の引数の前提条件と、その中で呼び出されるメソッド(、プロパティ、インデクサ、コンストラクタ)の前提条件が等しく、スローされる例外も等しい場合、*1に if ( index1 < 0 || index1 <= list1.Count )   …… if ( index2 < 0 …… は必要でしょうか? それとも呼び出される側に任せて例外のチェックを行わなくても良いのでしょうか?  チェックなどは重複しないほうがよいとは思うのですが、まだ細かいところがわかりません。どなたか詳しい方がいらっしゃいましたらご意見を伺わせてください。

  • C# 例外が発生しないことの保障

    Javaと比較して書きます。 Javaで記述した場合: public class JavaClass {  public static SampleClass s = new SampleClass(); } C#で記述した場合: public class CSharpClass {  public static SampleClass s = new SampleClass(); } JavaでもC#でも、同じコードを記述しているように見えますが、Javaではnew SampleClass()コンストラクタで例外が発生しない事が分かっているのに対して、C#の場合では例外が発生しないとは言い切れません。 これは、Javaでは、例外をスローする可能性のあるメソッド宣言では、その全てについてthrows宣言をしなければいけないのに対して、C#にはこの制約が存在しないことが原因です。 これについて何が困るかといいますと、C#で、static宣言な変数や静的コンストラクタで安易にメソッド呼び出し等を行うと、キャッチできなくなってしまいます。 public class Exceptionner {  public Exceptionner()  {   throw new ApplicationException("Exceptionnerクラスの例外");  } } public class SampleClass {  public static Exceptionner e = new Exceptionner(); // ここで例外が発生するが、キャッチできない。 } public class MyEntryPoint {  public static void Main()  {   try   {    SampleClass s = new SampleClass();   }   catch (Exception e)   {    // System.ApplicationExceptionでなくSystem.TypeInitializationExceptionとなる。    // つまり、元の例外の情報は失われている    Console.WriteLine(e.GetType());   }  } } これを現在漠然と問題視していますが、何かよい解決策はありませんでしょうか。 望んでいる解決策: ・C#でもメソッドが例外を返さないという保障がソースレベルでメソッドやコンストラクタに宣言可能? ・C#では例外をちゃんとキャッチしなくてもスマートに記述することが可能? ・問題視する必要がない?(whyも含めて)

  • Javaのプログラムについて教えて下さい

    //Sample.java class Sample void methodA(int temp) if(temp == 0) String str = new String("Exception"); Integer.parseInt(str); else if(temp == 1) int[] array = new int[temp]; else Exception exc = new Exception(); throw exc; //SampleMain.java class ExceptionMain public static void main(string[] args) Sample sam = new Sample(); Int temp = Integer.parseInt(args[0]); Sam.method(temp); } } このプログラムの場合、ExceptionMainに新たにコードを加えて、コマンドライン引数が0,1,その他の場合に例外メッセージを出力するプログラムを教えて下さい。

    • ベストアンサー
    • Java
  • 例外処理についてお願いします!!

    下のプログラミングについていくつか質問があります。 (1) プログラムの冒頭に来るpublic static void main(String[] args)を今まで気にしていなかったのですが これはどういうことですか?これもメソッドのひとつなんですか?このプログラムではpublic static void main(String[] args)でメソッドを定義してそれをetest( )メソッドで開いているという感じでしょうか? それとetstってどこから来たのかわかります?作者が勝手につけた名前だそうですが。 (2)FileReader fr = new FileReader("xfile.txt"); のところがわかりません。これはどういう意味ですか? public static void main(String[] args) { public static void etst( ) { try { // try節を書く FileReader fr = new FileReader("xfile.txt"); } catch (FileNotFoundException e) { // FileReader( )対応catch節 System.out.println("例外1: " + e); // 例外情報を表示 return; // 戻る } catch (IOException e) { // Close( )対応catch節 System.out.println("例外2: " + e); // 例外情報を表示 return; // 戻る } System.out.println("ファイルは正しくオープンされました"); } } } よろしくお願いします!!

    • ベストアンサー
    • Java
  • javaの質問です。その2

    明日JavaのBronze試験を受けに行くのですが、全然わからずに困っています。 紫色のJavaプログラマBronzr[SE7]という本を使用しています。 本の模試の問題です。 38 Class Foo{ static int val; static int methodA() {return ++val;} } Class Test{ public static void main(String[] args){ Foo.obj =new Foo(); obj.methodA(); }} } この問題では int valと宣言していますが、初期化をしていません。 なのでnullのはずなのですが、 なぜ++valで1になるのかがよくわかりません。 null+1は計算できないと思うのですが、、、、、 明日テストなので本当に困っています。

    • ベストアンサー
    • Java
  • 敬称について教えてください

    class parent{ protected final static int val=10; } class Child extends Parent{ private int val=100; public void method(String s){ System.out.println(++val)} } } class Test{ int val=10; public static void main(String args[]){ Parent c=new Child(); c.method("HELLO"); } } 初歩的な質問ですみません。教えて下さい。 上記プログラミングで、下から3行目のc.method・・・ を記入してもコンパイルエラーがおこらないのはなぜでしょうか? 今回newしているのはChildのオブジェクトです。 が、型はParentです。 Parentにはmethodはないし、 なぜこれが許されるのかがわかりません。 分かりやすくおしえてもらえませんか?

    • ベストアンサー
    • Java
  • &と|の演算子を使ったif文のプログラムについて

    ↓のプログラムの実行結果について質問します。 public class Test{ public static void main(String args[]){ if(methodA() & methodB() ){ System.out.print(1); }else{ System.out.print(2); } if(methodA() | methodB() ){ System.out.print(3); }else{ System.out.print(4); } } private static boolean methodA(){ System.out.print("A"); return false; } private static boolean methodB(){ System.out.print("B"); return true; } } 上記のプログラムを実行すると AB2AB3 と出力されるのですが、 何故こういう風になるのか教えていただけませんか? また、if文の中をそれぞれ if(methodA() & methodB() ) if(methodA() | methodB() ) と書き換えると A2A3 となるのですが、これについてもイマイチよく分かりません。 メソッドからfalseとtrueを戻り値として受け取り 演算子によって処理を分けているんでしょうけど、 どういう流れで処理が行われているのか 出力結果を見ても読めなくて・・・

    • ベストアンサー
    • Java