2011-04-03 55 views
1

我仍然在學習編程的薄霧中,其實很迷茫。有人可以幫助我,請正確實施這一點,下面是我的代碼,bascially我有一個方法,接受一個值,測試開關內的值。C#switch語句試試並抓取所需的幫助

林強制有關如何正確地捕捉ArgumentOutOfRangeException很困惑:S

public string InTheBox(int x) 
    { 
     try 
     { 
      //switch statment to lookup log ID 
      switch (x) 
      { 
       case 0: 
        return "Outter"; 
       case 1: 
        return "Inner"; 
       case 2: 
        return "Border"; 
       default: 
        throw new ArgumentOutOfRangeException("Unknown value"); 
      } 
     } 
     catch (ArgumentOutOfRangeException) 
     { 
      throw new ArgumentOutOfRangeException("Unknown value"); 
     } 
    } 

如果有人能請explaing我來捕獲這些異常的乾淨的方式。謝謝!

+1

捕獲異常簡單地拋出另外一個是不好的做法。 – Oded 2011-04-03 19:43:22

回答

10

爲什麼你有try catch塊?你可以簡單地有

public string InTheBox(int x) 
{ 
    //switch statment to lookup log ID 
    switch (x) 
    { 
     case 0: 
      return "Outter"; 
     case 1: 
      return "Inner"; 
     case 2: 
      return "Border"; 
     default: 
      throw new ArgumentOutOfRangeException("Unknown value"); 
    } 
} 
+0

感謝您爲我清除這個問題每個人都不好意思問這樣的問題我只是覺得它需要一個try catch:S, – CSharpNoobKing 2011-04-03 20:45:18

4

你不需要try { } catch { }這裏 - 你沒有做任何事情來解決這種方法的情況下,所以你只要想拋出異常(如你做的),並把它到調用這個來處理異常的方法。

0

這取決於你想要這個方法做什麼。如果參數無效,它應該拋出異常,那麼就完全刪除try/catch。

2

不要捕捉它,除非你會用它做什麼:

public string InTheBox(int x) 
{ 
    //switch statment to lookup log ID 
    switch (x) 
    { 
      case 0: 
       return "Outter"; 
      case 1: 
       return "Inner"; 
      case 2: 
       return "Border"; 
      default: 
       throw new ArgumentOutOfRangeException("Unknown value"); 
    } 

} 
0

問候..你唯一缺少的是你抓必須有一個變量來分配例外.. 。

取代:

catch (ArgumentOutOfRangeException) 
     { 
      throw new ArgumentOutOfRangeException("Unknown value"); 
     } 

catch (ArgumentOutOfRangeException ex) 
     { 
      throw new ArgumentOutOfRangeException("Unknown value"); 
     } 

當然,您創建catch/throw ... new的情況是多餘的,但我假設您是從更大的場景中提取此信息以設置您的問題。

我會建議做一些具有超出範圍值是這樣的:

default: 
      throw new ArgumentOutOfRangeException("Value out of range " + x.toString()); 

這可能會幫助您解決什麼原因造成的意外值。

希望這能讓你朝正確的方向發展。

乾杯,

CEC

+0

從技術上講,問題中的代碼可以正常工作(它對於異常無論如何,catch塊) – 2011-04-03 19:57:39

+0

@Chris巴拉德,我從來沒有理由測試,謝謝你的意見。 – 2011-04-03 20:34:30

+0

請注意,如果您要引發ArgumentOutOfRangeException,那麼最好使用指定參數名稱的構造函數重載。在這種情況下,您會在投擲新信息之前向其添加信息(與原始信息一致),這可能會證明只有在發生新的異常時纔會重複捕獲異常。 – 2011-04-03 20:35:03

2

你不需要try-catch塊在這個方法 - 它只是重新拋出異常所以不會改變任何東西。

結構異常處理的基本思想是你可以處理除了它發生的地方以外的異常。您在該方法中引發異常並在調用方法的區域處理異常。

那麼你的方法應該看起來像

public string InTheBox(int x) 
{ 
    //switch statment to lookup log ID 
    switch (x) 
    { 
      case 0: 
       return "Outter"; 
      case 1: 
       return "Inner"; 
      case 2: 
       return "Border"; 
      default: 
       throw new ArgumentOutOfRangeException("Unknown value"); 
    } 

} 

但是你怎麼稱呼它那樣:

try 
{ 
    //some code 
    InTheBox(someValue); 
    //perhaps some other code 
} 
catch(ArgumentOutOfRangeException ex) 
{ 
    //Action you take when exception occurs, perhaps notifying the user. 
}