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

C# 如何在简单方法中正确使用try-catch?,c#,.net,C#,.net,我想确保我的类是健壮的——即使它们很简单,对于一个有经验的程序员来说似乎很愚蠢 假设我有一个如下所述的方法,它接受字符串[],并将其作为int[]返回 public static int[] GetIntArrayFromStringArray(string[] stringArray) { int i = 0; int[] ints = new int[stringArray.Length]; foreach (var str in st

我想确保我的类是健壮的——即使它们很简单,对于一个有经验的程序员来说似乎很愚蠢

假设我有一个如下所述的方法,它接受字符串[],并将其作为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块中!)

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

您可以改用int.TryParse()

这里有一个例子

        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;
}
  • 如果stringArray为null,则立即引发NullArgumentException
  • 尝试更简单的转换方法:

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

    如果希望在任何字符串不是有效整数的情况下方法失败,则不要使用默认值,而是在TryParse失败时抛出InvalidArgumentException。

    以下是如何使用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;
    }
    

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

    公共静态int[]GetIntArrayFromStringArray(string[]stringArray)
    
    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;
        }
    
    { if(stringArray==null) { 抛出新ArgumentNullException(“stringArray”); } int count=stringArray.Length; int[]ints=新的int[count]; for(int i=0;i
    在.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;
    }
    

    在try上面声明变量statement@AlexR,您所说的昂贵内存是什么意思?@johnblade-我需要测试stringArray以确保它不为空。。。看起来try-catch并不是我对这类事情的最佳选择。为您修复了它,请参阅我的代码好的,所以您确实会抛出异常,但会专门执行异常,而不是“try-catch”。@Sisyphus是的,在这种方法中不需要try-catch块,因为没有不确定性(比如数据库或网络调用等)。您可以验证输入,如果输入无效,则接受它或向调用方抛出异常。编译器不喜欢这样。。。错误:使用未分配的局部变量“ints”当str为“0”时会发生什么-这不是跳过索引并将其保留为空吗?
    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;
    }