2009-10-05 7 views
9

いくつかのロギングを行うメソッドをデコレートしてから、無条件に例外をスローする方法はありますか?メソッドをマークする方法は無条件にスローされますか?

私はこのようなコードを持っている:

void foo(out int x) 
{ 
    if(condition()) { x = bar(); return; } 

    // notice that x is not yet set here, but compiler doesn't complain 

    throw new Exception("missed something."); 
} 

私はこのようにそれを書いてみた場合、私は問題を取得:

void foo(out int x) 
{ 
    if(condition()) { x = bar(); return; } 

    // compiler complains about x not being set yet 

    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 

任意の提案ですか?ありがとう。

+0

どのような問題が発生しますか? –

+0

"xは属性を持ち、まだメソッドの最後に設定されていません" – k0dek0mmand0

+1

私は混乱しています - xが設定されているときにスローされずにリターンされた場合、無条件にスローされる方法 – Matt

答えて

17

これはいかがですか?

bool condition() { return false; } 
int bar() { return 999; } 
void foo(out int x) 
{ 
    if (condition()) { x = bar(); return; } 
    // compiler complains about x not being set yet 
    throw MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
Exception MyMethodThatAlwaysThrowsAnException(string message) 
{ 
    //this could also be a throw if you really want 
    // but if you throw here the stack trace will point here 
    return new Exception(message); 
} 
2

例外が常にスローされることがわかっている場合は、どうして問題になりますか。ただ、何かに変数を設定するので、それをコンパイルすることができます:

void foo(out int x) 
{ 
    if(condition()) { x = bar(); return; } 

    x = 0; 

    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
+3

これは私がやりたくないことです。:) – k0dek0mmand0

0

それはあなたの質問に答えていませんが、パラメータを使用している場合には、メソッドの先頭でそれらを初期化するために、常に良い考えです。あなたが任意のコンパイルエラーを持っていません。この方法:

void foo(out int x) 
{ 
    x = 0; 
    if(condition()) { x = bar(); return; } 
    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
+4

私は、パラメータがいくつかのコードパスでパラメータを割り当てるのを忘れてしまったので、コンパイル時にいくつかの隠れたバグを防ぐかもしれないので、それが意味のある場所に割り当てられるべきだと思います。 –

1

x outパラメータであり、あなたがこのようにメソッドをマーキングする方法はありません、前方

+3

例外がスローされない限り、 – k0dek0mmand0

+1

outパラメータがメソッドの早い段階で設定されていることを確認し、そうでない場合はデフォルトを代入することをお勧めします。 –

2

を移動する前に設定する必要があります。

おそらく無関係ですが、outパラメータを使用しているあなたの例のパターンは少し奇妙です。代わりに、代わりにメソッドの戻り値の型を持たないのはなぜですか?

int Foo() 
{ 
    if (condition()) return bar(); 

    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
+0

これはほんの一例です。実際のコードはかなり複雑です。 – k0dek0mmand0

+0

@ k0dek0mmand0:私はそうかもしれないと思った。私はあなたが不運だと思う - 'MyMethodThatAlwaysThrowsAnException'が常にスローすることをコンパイラに伝える方法はありません。 – LukeH

1

xを設定したくない場合は、代わりにrefパラメータを使用してください。

void foo(ref int x) 
{ 
    if(condition()) { x = bar(); return; } 

    // nobody complains about anything 

    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
2

それは非常に古いスレッドだが、私はちょうどあなたが最初から別のそれを書く必要があります追加したい:

void foo(out int x) 
{ 
    if (!condition()) 
     MyMethodThatAlwaysThrowsAnException("missed something."); 

    x = bar(); 
    // and so on... 
} 

方法コンパイラが文句を言わないだろうし、あなたのコードははるかに明確であること。

+0

実際のコードはおそらくもっと複雑なので、あなたの提案は意味をなさないかもしれません。 –

関連する問題