2009-10-05 12 views
9

Czy istnieje sposób, aby udekorować metodę, która zrobi pewne logowanie, a następnie rzucić wyjątek bezwarunkowo, jako taki?Jak oznaczyć metodę rzucać bezwarunkowo?

mam kod jak poniżej:

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."); 
} 

jeśli próbuję pisać to tak mam problem:

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

    // compiler complains about x not being set yet 

    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 

jakieś sugestie? Dzięki.

+0

Jaki masz problem? –

+0

"x ma atrybut out i nie został jeszcze ustawiony na końcu metody" – k0dek0mmand0

+1

Jestem zdezorientowany - w jaki sposób jest on generowany bezwarunkowo, jeśli nie zostanie rzucony, gdy x jest ustawione (i powrót jest zrobiony) – Matt

Odpowiedz

17

Co powiesz na to?

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

Jeśli wiesz, że wyjątek zawsze będzie rzucany, dlaczego ma to znaczenie. Wystarczy ustawić zmienną coś więc można go skompilować:

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

    x = 0; 

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

Dokładnie tego chciałem uniknąć.:) – k0dek0mmand0

0

To nie jest odpowiedź na pytanie, ale podczas korzystania z parametrów jest zawsze dobry pomysł, aby zainicjować je na początku metody. W ten sposób nie będzie żadnych błędów kompilatora:

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

Myślę, że parametry powinny być przypisane tam, gdzie ma to sens lub jako że mogą one zapobiegać niektórym ukrytym błędom podczas kompilacji, tylko dlatego, że zapomniałeś przypisać parametr w pewnej ścieżce kodu. –

1

x jest się parametrem i musi być ustawiona przed przodu

+3

, chyba że zostanie zgłoszony wyjątek. – k0dek0mmand0

+1

Nadal dobrze jest zapewnić, że wszystkie parametry wyjściowe zostaną wcześnie ustawione w metodzie i przypisać do nich wartości domyślne, jeśli nie. –

2

Nie ma sposobu znakowania metodę w ten sposób.

Prawdopodobnie nieistotne, ale wzór w twoim przykładzie, używając parametru out, jest nieco dziwny. Dlaczego zamiast tego wystarczy podać typ zwrotu w metodzie?

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

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

To był tylko prosty przykład. Rzeczywisty kod jest bardziej skomplikowany. – k0dek0mmand0

+0

@ k0dek0mmand0: Podejrzewałem, że tak być może. Domyślam się, że nie masz szczęścia - nie ma sposobu, aby powiedzieć kompilatorowi, że 'MyMethodThatAlwaysThrowsAnException' zawsze wyrzuca. – LukeH

1

Jeśli nie chcesz ustawiać x, dlaczego nie chcesz użyć parametru ref?

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

    // nobody complains about anything 

    MyMethodThatAlwaysThrowsAnException("missed something."); 
} 
2

To bardzo stary wątek, ale po prostu chcę dodać trzeba napisać, że różni się od samego początku:

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

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

ten sposób kompilator nie będzie narzekać i kod jest znacznie bardziej jasne.

+0

Rzeczywisty kod jest prawdopodobnie bardziej skomplikowany, więc Twoja sugestia może nie mieć sensu. –

Powiązane problemy