C# 如何在简单方法中正确使用try-catch?
我想确保我的类是健壮的——即使它们很简单,对于一个有经验的程序员来说似乎很愚蠢 假设我有一个如下所述的方法,它接受字符串[],并将其作为int[]返回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
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;
}
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;
}