我需要一个接一个地执行大量语句,并且我需要在sigle语句抛出异常时,程序流继续执行下一个语句,例如:< / p>
double a = Double.Parse("2.5");
double b = Double.Parse("ADFBBG");
Geometry g = Geometry.Parse("M150,0L75,200 225,200z");
所有语句都必须执行,所以我需要一种级联的try-catch块:
double a, b;
Geometry g;
try
{
a = Double.Parse("2.5");
}
catch
{}
try
{
b = Double.Parse("ADFBBG");
}
catch
{}
try
{
g = Geometry.Parse("M150,0L75,200 225,200z");
}
catch
{}
显然,这不是编写程序最优雅的方式。 有更好的方式(更优雅,不会显着降低性能)?
我尝试以这种方式使用Func<TResult>
委托:
我写了以下方法:
T Try<T>(Func<T> func)
{
try
{
return func();
}
catch
{
return default(T);
}
}
所以我可以这样使用它:
double x = Try(() => Double.Parse("77"));
Geometry g = Try(() => Geometry.Parse("M150,0L75,200 225,200z"));
其他解决方案?
答案 0 :(得分:0)
返回指示转换是否成功的值。所以你可以用以下方式使用它:
double converted;
bool success = Double.TryParse(value, out converted);
if (success)
{
// Do whatever you want
// The converted value is in the variable 'covnerted'
}
答案 1 :(得分:0)
似乎你不关心哪个解析失败但是只需要一个默认值就是失败的情况?如果是这样,首先将你的变量初始化为默认值,然后在单个try-catch中解析:
double a=0.0, b=0.0;
Geometry g = new Geometry();
try
{
a = Double.Parse("2.5");
b = Double.Parse("ADFBBG");
g = Geometry.Parse("M150,0L75,200 225,200z");
}
catch
{
//At least mark that conversion was not succesful
}
Try-catch只会在抛出异常时给你带来性能损失。如果一切顺利,try-catch的影响微乎其微。看到这个question 比你发布的代码更优雅,但至少更简洁。
替代使用TryParse
double a=0.0, b=0.0;
Geometry g = new Geometry();
Double.TryParse("2.5", out a);
Double.TryParse("ADFBBG", out b);
Geometry.TryParse("M150,0L75,200 225,200z", out g);
但有一点需要注意:几何没有实现TryParse ...(假设您使用System.Windows.Media.Geometry
)
这让我想到了这一点:
无论哪种方式:验证用户输入都需要花费。
回答主要问题:如何在try-catch块中正确放置语句? 如果您不关心哪个语句失败:1 try-catch。
但是:如果第一个语句失败,则不会执行另一个语句。但是,您的系统已处于故障/损坏状态。进一步处理会得到正确的结果吗? (怀疑)
答案 2 :(得分:-1)
更优选TryParse,因为您在抛出和捕获异常时没有性能损失。
上述代码中还有一个不准确之处 - 解析为“0”和默认(T)之间没有区别。
代码比你的快得多
public static class StringExt
{
public static double ParseDouble(this string value)
{
double result;
Double.TryParse(value, out result);
return result;
}
}
答案 3 :(得分:-1)
我几天前回答了类似的问题。如果你有一个字符串值的集合,你可以使用扩展方法的力量来做到这一点。
static public IEnumerable<double> ConvertToDouble(this IEnumerable<string> source)
{
double x = 0;
var result = source.Where(str => Double.TryParse(str, out x))
.Select (str => x);
return result;
}
将所有内容放入集合中,然后使用.AsEnumerable()
后跟ConvertToDouble()
扩展方法。无法解析的所有内容都将被忽略而没有异常,结果类型为IEnumerable<Double>
原始答案:Convert List<string> to List<int> in C#
/编辑:downvoter关心解释? OP尚未澄清,为什么他想使用try catch并且没有解释在异常的情况下必须做什么。 Hance我认为如果引发异常,他不想做任何事情。