如何在try-catch块中正确放置语句?

时间:2013-11-03 10:33:04

标签: c# exception try-catch func

我需要一个接一个地执行大量语句,并且我需要在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"));

其他解决方案?

4 个答案:

答案 0 :(得分:0)

使用Double.TryParse

返回指示转换是否成功的值。所以你可以用以下方式使用它:

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&lt;&gt; func,doens't减少开销但很干净
  • 首先验证字符串。删除了try的开销,但在解析时引入了运行时开销。

无论哪种方式:验证用户输入都需要花费。

回答主要问题:如何在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我认为如果引发异常,他不想做任何事情。