如何在简单方法中正确使用try-catch?

时间:2012-07-04 09:22:42

标签: c# .net

我想确保我的课程很健壮 - 即使它们很简单,对于有经验的程序员来说也是愚蠢的。

假设我有一个如下所示的方法接受字符串[]并将其作为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为null的任何错误!

也许我应该用它?

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

但不确定在发生错误时该怎么办...我是否返回null int []或抛出异常?

(我还必须检查int.Parse(str)是否没有失败 - 我已经到了那个但希望它可以在try-catch块中!) < / p>

正如我所说,在我养成太多坏习惯之前,这些是我想要尝试并且正确的任务。感谢。

8 个答案:

答案 0 :(得分:1)

您可以使用int.TryParse()代替。

http://msdn.microsoft.com/en-us/library/f02979c7.aspx

答案 1 :(得分:1)

  1. 如果 stringArray 为null,则立即抛出 NullArgumentException
  2. 尝试更简单的转化:

    return stringArray.Select(s =&gt; IntParseOrDefault(s,0))。ToArray();

  3. IntParseOrDefault 就像这样:

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

    如果您希望方法失败,如果任何字符串不是有效整数,那么在时抛出 InvalidArgumentException 而不是使用默认值TryParse 失败。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

以下是如何使用try-catch:

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;
}

答案 4 :(得分:0)

我会在catch块中抛出一个自定义异常。因此,您的类的用户可以捕获此异常。

答案 5 :(得分: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;
    }

答案 6 :(得分: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;
    }

答案 7 :(得分: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;
}