【问题标题】:How to simplify return's statement from try-catch [duplicate]如何从try-catch简化return语句[重复]
【发布时间】:2016-03-07 21:04:53
【问题描述】:

如何简化以下代码:

try
{
    var metadata = GetMetadata();
    return metadata ?? _provider.GetLatestMetadata(guid);
}
catch (AuthenticationException)
{
    return _provider.GetLatestMetadata(guid);
}
catch (HttpUnauthorizedRequestException)
{
    return _provider.GetLatestMetadata(guid);
}
catch (WebException)
{
    return _provider.GetLatestMetadata(guid);
}
catch (VcenterException)
{
    return _provider.GetLatestMetadata(guid);
}

我想避免代码重复。

有可能吗?

【问题讨论】:

  • 你想做什么?实现重试机制?
  • 我在这里看不到异常捕获的任何目的。
  • 如果你想避免代码重复,为什么不捕获通用基础catch (Exception)

标签: c# exception-handling code-duplication


【解决方案1】:

如果您不想包罗万象并且确实需要避免重复代码,则可以使用异常过滤器捕获特定异常:

try
{
    var metadata = GetMetadata();
    return metadata ?? _provider.GetLatestMetadata(guid);
}
catch (Exception ex) when ( ex is AuthenticationException
                            || ex is HttpUnauthorizedRequestException
                            || ex is WebException
                            || ex is VcenterException
                          )
{
    return _provider.GetLatestMetadata(guid);
}

【讨论】:

  • 哦。 when...这么多年的编程,实际上我刚刚学会了这个......甚至以前从未听说过这个。哇。
  • 它只是一个 C# 6 运算符,所以还是新的 :)
  • 啊,我明白了。看起来我很高兴看到空条件运算符、字符串插值和自动属性的默认值,但没有注意到这一点。感谢您的解释! :)
  • 如果没有 C# 6 运算符 when,我是否需要在 catch 中出现 throw 异常?
  • 两者都可以。没问题。
猜你喜欢
  • 2014-06-18
  • 2016-11-25
  • 2013-02-19
  • 2011-12-21
  • 2010-11-25
  • 2014-06-05
  • 2018-02-07
  • 2014-10-10
  • 2014-02-03
相关资源
最近更新 更多