2012-07-04 28 views
0

我想確保我的課程是健壯的 - 即使它們對於有經驗的程序員來說很簡單並且看起來很愚蠢。如何在簡單方法中正確使用try-catch?

比方說,我有一個接受字符串[]並將其作爲int []返回的方法。

public static int[] GetIntArrayFromStringArray(string[] stringArray) 
    { 
     int i = 0; 
     int[] ints = new int[stringArray.Length]; 
     foreach (var str in stringArray) 
     { 
      ints[i++] = (str != "" ? int.Parse(str) : 0); 
     } 
     return ints; 
    } 

是使用try-catch並拋出異常的最佳選擇嗎?當我嘗試使用try-catch時,它似乎與我的變量不在範圍內有問題,但我需要它們在try-catch中,以捕獲stringArray爲空的任何錯誤!

也許我應該用這個?

if (stringArray == null) //do something ... 

,但不知道該怎麼在一個錯誤的情況下做的......我返回一個空INT []或拋出異常?

(我也有檢查int.Parse(STR)不會失敗 - 我得到那一個,但希望它可能是在try-catch塊!)

由於我說,在我養成太多不良習慣之前,這些都是我想要嘗試的正確的簡單任務。謝謝。

+1

使用int.TryParse(),而不是.. – Tisho

+0

聲明try語句 – JohnnBlade

+0

@AlexR以上的變量,做什麼你的意思是價格昂貴 - 記憶明智嗎? – Sisyphus

回答

0
public static int[] GetIntArrayFromStringArray(string[] stringArray) 
    { 
     if (stringArray == null) 
     { 
      throw new ArgumentNullException("stringArray"); 
     } 

     int count = stringArray.Length; 
     int[] ints = new int[count]; 
     for (int i = 0; i < count; i++) 
     { 
      int intValue; 
      ints[i] = int.TryParse(stringArray[i], out intValue) ? intValue : 0; 
     } 
     return ints; 
    } 
0

下面的例子

 foreach (string str in stringArray) 
     { 
      int nr = 0; 
      int.TryParse(str, out nr); 

      if (nr > 0) 
       ints[i++] = nr; 
     } 

這裏是完整的代碼

public static int[] GetIntArrayFromStringArray(string[] stringArray) 
{ 
    if (stringArray == null || stringArray.Length == 0) 
     throw new ArgumentNullException("string array is null or empty"); 

    int i = 0; 
    int[] ints = new int[stringArray.Length]; 
    foreach (var str in stringArray) 
    { 
     int nr = 0; 
     int.TryParse(str, out nr); 
     if (nr > 0) 
      ints[i] = nr; 
     i++; 
    } 
    return ints; 
} 
+0

當str是「0」時會發生什麼 - 不會跳過索引並將其保留爲空? – Sisyphus

1
  1. 如果字符串數組爲空,馬上拋出一個NullArgumentException
  2. 試一下簡單的轉換:

    返回stringArray.Select(S => IntParseOrDefault(S,0))ToArray的();

IntParseOrDefault僅僅是這樣的:

int IntParseOrDefault(string s, int defaultVal) 
{ 
    int i; 
    if (!int.TryParse(s, out i)) i = defaultVal; 
    return i; 
} 

如果你想方法失敗,如果字符串的任何是不是一個有效的整數,然後,而不是使用默認值,拋出InvalidArgumentExceptionTryParse失敗。

+0

好吧,所以你會拋出Exceptions,但是專門做它們而不是「try-catch」。 – Sisyphus

+0

@Sisyphus是的,這種方法沒有必要使用try-catch塊,因爲沒有不確定性(比如數據庫或網絡調用等)。您可以驗證輸入,如果輸入無效,則接受它或將異常拋回給調用者。 – McGarnagle

0

這裏是你如何使用try - 美中不足的是:

public static int[] GetIntArrayFromStringArray(string[] stringArray) 
{ 
    int i = 0; 
    int[] ints = null; 
    try { 
     ints = new int[stringArray.Length]; 
     foreach (var str in stringArray) 
     { 
      ints[i++] = (str != "" ? int.Parse(str) : 0); 
     } 
    } 
    catch { 
     // Throw custom exception 
    } 
return ints; 
} 
+0

編譯器不喜歡這個...錯誤:使用未分配的局部變量'ints' – Sisyphus

+0

@Sisyphus - 編輯答案 –

0

我會扔在catch塊定製例外。所以你的類的用戶可以捕獲這個異常。

0
public static int[] GetIntArrayFromStringArray(string[] stringArray) 
    { 
     int i = 0; 
     int[] ints; 
     int num; 
     if (stringArray == null && stringArray.Length > 0) 
     { 
     ints = new int[stringArray.Length] 
     foreach (var str in stringArray) 
     { 
      if (string.IsNullOrEmpty(str) && int.TryParse(str, num)) 
      { 
      ints[i++] = num; 
      } 
     } 
     } 
     return ints; 
    } 
0

.NET Framework中的許多方法拋出無效輸入異常都有不拋出同行,通常與Try前綴,返回一個布爾值來代替。例如,在int.Parse的情況下,你就可以更輕鬆地調用int.TryParse,如:

public static int[] GetIntArrayFromStringArray(string[] stringArray) 
{ 
    int i = 0; 
    int[] ints = new int[stringArray.Length]; 
    foreach (var str in stringArray) 
    { 
     int a = 0 
     int.TryParse(str, out a) 
     ints[i++] = a; 
    } 
    return ints; 
} 
相關問題