【问题标题】:Best way to handle Convert failures?处理转换失败的最佳方法?
【发布时间】:2013-08-22 14:41:45
【问题描述】:

在我的应用程序中,我有以下行:

double val = Convert.ToDouble(values8[x]) + 24837;

如果values8[x] 无法转换为Double,则应用程序崩溃并显示错误Input string was not in a correct format

如何测试这个,如果转换失败,将val 设置为DBNull.Value?尝试/捕捉?这样的事情可以接受吗?

编辑:这就是我想要做的事情

try 
{
    double val = Convert.ToDouble(values8[x]) + 24837;
    com.Parameters.Add("@p1", OleDbType.Date, 255).Value = DateTime.FromOADate(val);
}
catch (exception e)
{
    com.Parameters.Add("@p1", OleDbType.Date, 255).Value = DBNull.Value;
}

EDIT2:TryParse 是我要找的。​​p>

【问题讨论】:

  • values8[x] 对我来说听起来像是代码味道。请创建一个合适的数据模型。
  • 有各种.TryParse方法。
  • 您不能将DBNull.Value 存储在double 类型的变量中。大概是有更多代码(未显示)试图将值发送到数据库?
  • 0 大约是指示错误的最差默认值!好像 0 不是有效的双精度数?

标签: c#


【解决方案1】:

您最好使用double.TryParse 方法,而不是尝试捕获,这可能会更昂贵:

double val;
if (double.TryParse(values8[x], out val))
{
    // you can safely use the val variable here
}
else
{
    // parsing failed
}

如果您事先知道文化,您也可以指定文化(您知道小数分隔符可能因文化而异,...):

double val;
var culture = new CultureInfo("fr-FR");
if (double.TryParse(values8[x], NumberStyles.None, culture, out val))
{
    // you can safely use the val variable here
}
else
{
    // parsing failed
}

【讨论】:

  • @Rotem 我记得这已经在某处进行了详细讨论,主要论点是不应使用异常来控制程序流程,因此TryParse 无论如何都更干净。
  • @Rotem 不,TryParse 不会在后台捕获异常。 Number::ParseNumber 实际上是在解析字符串(无论如何,因为Numermscorlib.dll 中的内部类,所以它的实现细节可能会改变)。
  • 太好了,你可以在我的代码的else 部分中使用DBNull.Value,就像你在catch 语句中所做的那样。只是使用TryParse方法比尝试和捕捉要快。
  • @Rotem 实际上,如果您使用 ILSpy 查看源代码,Try 版本和非 Try 版本调用执行完全相同的步骤,除了 try 版本具有 return false 和非 Try 版本有一个throw new FormatExecption 并且抛出异常总是比仅仅返回 false 慢。
【解决方案2】:

double 有一个应该使用的 TryParse 方法。如果解析成功,则 val 将获得值,否则不会将值分配给 val。不会抛出异常

double val;

if(double.TryParse(values8[x], out val))
{
     Console.WriteLine("Parsing successful");
}
else
{
   Console.WriteLine("Parsing failed");
}

【讨论】:

    【解决方案3】:

    根据您的编辑,您需要这个:

    double val;
    
    if (!Double.TryParse(values8[x], out val))
       com.Parameters.Add("@p1", OleDbType.Date, 255).Value = DBNull.Value;
    else
       com.Parameters.Add("@p1", OleDbType.Date, 255).Value = DateTime.FromOADate(val + 24837);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      相关资源
      最近更新 更多