2012-05-22 93 views
-3

這裏是我不能在C#中找出一個奇怪的場景:額外拋出異常

try 
{ 
    Call to database. 
    If results from database are empty 
      throw new Exception("No results"); 
} 
catch(Exception ex) 
{ 
    if (ex.Message.Equals("No results")) 
     throw; 
    else 
     throw new Exception("Exception from database"); 
} 

通過正確的輸出應該是:Exception ("No results")

然而此刻,它不斷拋出2個例外,即Exception("No results")Exception("Exception from database")

更新:我試圖拋出'ex'作爲內部異常,因此'throw new Exception("Exception from database", ex)'。原來,實際上是'Exception("No results")

任何人都可以向我解釋爲什麼會發生這種情況嗎?

謝謝!

PS:調整了上面的一點。現在希望它更清楚。它的「拋出」不是「返回」。道歉錯誤地使用條款。

+0

什麼是'ex.Message'? –

+2

你的問題沒有意義。異常不會返回,並且在同一個線程上不能同時拋出2。 – leppie

+2

「返回」不能有2個例外。請給出一個更好的描述。在你觀察到的地方張貼周圍的漁獲物。 –

回答

-1

我不是100%確定從你的代碼片段,但它聽起來像你似乎有「兩個」例外的原因可能是你重新投擲原始的。

看看這個鏈接,「扔恩」(通常情況下)和「扔」之間在C#中的區別:

http://geekswithblogs.net/sdorman/archive/2007/08/20/Difference-between-quotthrowquot-and-quotthrow-exquot-in-.NET.aspx

+0

嗨,沒有它不是因爲扔掉或拋出。我試了兩次,行爲也是一樣的。仍然拋出2個異常。 – codeandfootball

1

調用數據庫的時候(或處理時,有例外來自數據庫的結果)。

順便說一句,如果你沒有在數據庫中找到某些數據,那很少出現異常情況。只需返回null或空集合。

Foo GetFooById(int id) 
{ 
    try 
    { 
     Call to database. 
     If results from database are empty 
      return null; 
    } 
    catch(SqlException ex) 
    { 
     throw new MyDataAccessException("Cannot find foo", ex); 
    } 
} 

另一個建議 - 不要在流量控制中使用異常。

+0

嗨,諾普。數據庫調用沒問題,當我在調試模式下嘗試時。 – codeandfootball

+0

也許你有NullReferenceExeption,IndexOutOfRangeException,cating異常或其他異常。原因可能在您的數據庫結果處理代碼中。不要吞噬你的例外。在創建新的例外時提供原始異常,如上面的代碼所示。 –

+0

是的好建議,我正在處理別人的代碼,誰使用流量控制異常。順便說一下,作爲一個側面問題,我也嘗試創建自定義異常,將原始異常作爲自定義異常的內部異常。但是,一旦它通過WCF,內部異常消失。這是WCF的正確行爲嗎? – codeandfootball