TryCatch 与 TryParse 的优缺点

发布于 2024-08-25 01:39:35 字数 505 浏览 9 评论 0原文

使用以下任一方法从对象中提取双精度值有何优缺点?除了个人喜好之外,我寻求反馈的问题还包括调试的难易性、性能、可维护性等。

public static double GetDouble(object input, double defaultVal)
{
    try
    {
        return Convert.ToDouble(input);
     }
     catch
     {
        return defaultVal;
     }
}

public static double GetDouble(object input, double defaultVal)
{
    double returnVal;
    if (double.TryParse(input.ToString(), out returnVal))
    {
        return returnVal;
    }
else
    {
        return defaultVal;
    }
}

What are the pros and cons of using either of the following approaches to pulling out a double from an object? Beyond just personal preferences, issues I'm looking for feedback on include ease of debugging, performance, maintainability etc.

public static double GetDouble(object input, double defaultVal)
{
    try
    {
        return Convert.ToDouble(input);
     }
     catch
     {
        return defaultVal;
     }
}

public static double GetDouble(object input, double defaultVal)
{
    double returnVal;
    if (double.TryParse(input.ToString(), out returnVal))
    {
        return returnVal;
    }
else
    {
        return defaultVal;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

请你别敷衍 2024-09-01 01:41:02

在某些情况下,最好使用 try catch 块主动查找或检查输入。
例如,如果我们有一个带有用于 ineteger 到字符串转换的查找表的字典,那么如果我们只使用 ContainsKey 而不是使用 try catch 来检查键,那么性能会很好

In some cases it is better to proactively look or check for the input against using try catch block.
Example if we have a dictionary with lookup table for ineteger to string conversion it is good performance wise if we just use ContainsKey instead of using try catch for checking the key

野侃 2024-09-01 01:41:00

TryParse 更快,通常更好,但我建议在框架和后端编程中使用 TryCatch 方法,因为您可以向客户端提供有关错误的更多信息:

public double GetAge()
{
   try
   {
      var input = _dataProvider.GetInput();
      return Convert.ToDouble(input);
   }
   catch(Exception ex)
   {
      throw new MyBackendException(ex);
   }
}

TryParse is faster and usually better but I would suggest the TryCatch approach in framework and back-end programming because you can give more information to the client about the error:

public double GetAge()
{
   try
   {
      var input = _dataProvider.GetInput();
      return Convert.ToDouble(input);
   }
   catch(Exception ex)
   {
      throw new MyBackendException(ex);
   }
}
高速公鹿 2024-09-01 01:40:58

让 Parse 方法在错误输入时抛出异常是一个设计缺陷。当您从用户处获取数据时,错误输入是预期的行为。抛出异常的成本很高,您不希望在代码中经常发生这种情况。

值得庆幸的是,微软意识到了他们的错误并添加了 TryParse 方法。 TryParse 确实不会产生错误输入引发异常的开销,但缺点是它必须返回两条数据,所以使用起来感觉有点尴尬。

现在,如果他们没有首先创建损坏的 Parse 实现,TryParse 就会被称为 Parse。

Having the Parse methods throw exceptions on bad input was a design flaw. Bad input is expected behavior when you take in data from a user. Exception throwing is expensive, it's not something you want happening routinely in your code.

Thankfully, Microsoft realized their mistake and added the TryParse methods. TryParse does not incur the overhead of exception throwing on bad input, but the downside is it has to return two pieces of data, so it feels a bit awkward to use.

Now if they hadn't created the broken Parse implemetation in the first place, TryParse would just be called Parse.

流殇 2024-09-01 01:40:55

TryParse 比 TryCatch 性能更高效。

TryParse is more efficient than TryCatch performance wise.

娇俏 2024-09-01 01:40:52
  • TryParse 比捕获异常更快
  • TryParse 指示了一些预期 - 这里没有发生任何异常,只是您怀疑您的数据可能不是有效的。
  • TryParse 不使用正常控制流的异常处理

基本上,使用 TryParse :)

顺便说一句,您的代码可以重写为:

public static double GetDouble(object input, double defaultVal)
{
    double parsed;
    return double.TryParse(input.ToString(), out parsed)) ? parsed : defaultVal;
}
  • TryParse will be faster than catching an exception
  • TryParse indicates something expected - nothing exceptional is happening here, it's just that you suspect your data may not be valid.
  • TryParse isn't using exception handling for normal control flow

Basically, go with TryParse :)

By the way, your code can be rewritten as:

public static double GetDouble(object input, double defaultVal)
{
    double parsed;
    return double.TryParse(input.ToString(), out parsed)) ? parsed : defaultVal;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文