2009-10-05 54 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

你有什麼問題? – 2009-10-05 14:51:34

+0

「x有out屬性,並且尚未在方法結尾設置」 – k0dek0mmand0 2009-10-05 14:52:37

+1

我很困惑 - 如果它在x被設置(並且返回完成)時沒有拋出,它將如何無條件拋出 – Matt 2009-10-05 14:53:25

回答

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 2009-10-05 14:53:34

0

它不回答你的問題,但使用了參數時,它始終是一個好主意,初始化它們在方法的開始。這樣,你不會有任何編譯器錯誤:

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

我認爲應該將參數分配給合理的地方,或者因爲它可能會在編譯時防止一些隱藏的錯誤,因爲您忘記了在某些代碼路徑中分配參數。 – 2009-10-05 14:57:48

1

x參數,必須設置,然後再移動着

+3

除非拋出異常 – k0dek0mmand0 2009-10-05 14:55:47

+1

確保在方法的早期設置任何out參數並且如果不是,則爲它們分配默認值仍然是一個好策略。 – 2009-10-05 15:00:02

2

有沒有標記在這樣的方法方式。

可能無關緊要,但示例中使用out參數的模式有點奇怪。爲什麼不在該方法上使用返回類型呢?

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

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

這只是一個簡單的例子。實際的代碼相當複雜。 – k0dek0mmand0 2009-10-05 14:57:27

+0

@ k0dek0mmand0:我懷疑可能是這種情況。我猜你沒有運氣 - 沒辦法告訴編譯器總是拋出「MyMethodThatAlwaysThrowsAnException」。 – LukeH 2009-10-05 14:59:10

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

實際的代碼可能更復雜,所以你的建議可能沒有意義。 – 2016-03-01 15:15:39

相關問題