4

我在这里有一个 1.1 的构建系统,使用 Parse 来转换值(现在是 3.5)。

string myString = String.Empty;
double myValue = double.Parse(myString);

抛出一个 FormatException (我期望 0.0)。

如果我使用 2.0+ 重写它

string myString = String.Empty;
double myValue;
if (double.TryParse(myString, out myValue))
    //do something

我得到了想要的 0.0,但不幸的是,我失去了获得有意义的错误消息的可能性(在 else 树中)。

为什么给我 Parse 一个错误而 TryParse 我的期望值?有什么方法可以从 TryParse 中获取错误消息(时间不是问题)?

我不想这样解决它:

  • 使用 if...then 避免错误

    myValue = myString.Length == 0 ? 0.0 : double.Parse(myString);
    
  • 如果发生错误,两次调用

    if (!double.TryParse(myString, out myValue))
        myValue = double.Parse(myString);
    
4

7 回答 7

8

Parse如果无法解析字符串,则抛出异常并TryParse返回bool. 您可以处理此布尔值(如果解析成功,则为 true,否则为 false)以显示您想要显示的成功/错误消息。

由于它myValue是一个out必须由方法设置的参数,因此如果无法解析字符串,TryParse 会将其设置为 0.0,这就是您在使用 TryParse 方法时获得该数字的原因。

于 2012-12-19T13:31:42.547 回答
2

不,不可能得到确切的错误消息。您只想知道是否可以转换为 double 以及结果(如果可能)。转换失败的确切原因对您来说是隐藏的。

于 2012-12-19T13:31:34.940 回答
2

TryParse 允许您在不抛出异常的情况下进行转换,如果成功则返回 true。你采取的行动取决于你

if (!double.TryParse(myString, out myValue))
{
//throw exception here
}

当您不确定输入是否始终是数字时,它很有用

于 2012-12-19T13:32:32.970 回答
1

为什么给我 Parse 一个错误而 TryParse 我的期望值?

因为这就是界面的设计方式。TryParse如果输入的格式无效,则不会引发异常。相反,它返回false.

有什么方法可以从 TryParse 中获取错误消息(时间不是问题)?

不,但您可以自己制作错误消息。

if (double.TryParse(myString, out myValue))
{
    //do something
}
else
{
    throw new FooException("Problem!");
}

但是如果你想在出现错误时抛出异常,那么使用Parse.

于 2012-12-19T13:31:17.397 回答
0

必须设置 Out 参数,因此如果 TryParse 失败,它将在返回之前将输出初始化为其默认值,但是您将在“else”循环中......这意味着它失败了......

尝试运行下面的代码,这将显示 TryParse 实际上覆盖了该值,但表明解析失败......

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                ParseAndOutput("");
                ParseAndOutput("1.0");
                ParseAndOutput("ABC");
            }

            private static void ParseAndOutput(string input)
            {
                double value = -1;
                if (double.TryParse(input, out value))
                {
                    Console.WriteLine("Parse succeeded for '"+input+"', try parse changed to: " + value);
                }
                else
                {
                    Console.WriteLine("Parse failed for '" + input + "', try parse changed to:  " + value);
                }
            }
        }
    }

所以 Parse 和 TryParse 在 string.Empty 上都失败了,他们只是以不同的方式报告失败,这就是 TryParse 的全部意义,它永远不会引发异常......

于 2012-12-19T13:48:02.893 回答
0

TryParse以某种方式实现如下:

try
{
    Parse(...);
    return true;
}
catch
{
    return false;
}

所以你可以用同样的方法来做:

try
{
    double.Parse(str, out dbl);
}
catch (Exception ex)
{
    // Do something with ex.Message
    dbl = 0.0;
}

// Continue with dbl.
于 2012-12-19T13:34:57.070 回答
0

忘记double.TryParse,因为它不会(按设计)告诉您解析失败的原因。做旧方式:

string myString = String.Empty;
double myValue = 0.0;

try
{
    myValue = double.Parse(myString);
}
catch (FormatException)
{
    // Now you have a meaningful story here!
}
于 2012-12-19T13:35:27.967 回答