【问题标题】:Re-throw an exception in a conditional expression在条件表达式中重新抛出异常
【发布时间】:2022-01-23 08:58:23
【问题描述】:

使用条件表达式重写以下catch 块中的代码的正确方法是什么?如果支持!?

try
{
    return await _client.GetStreamAsync(_uri);
}
catch
{                
    if (IsConnected)
        throw;
    else
        throw new IOException();
}

C#编译器不喜欢下面的

IsConnected ? throw : new IOException();

请注意,重新抛出捕获的异常,如下所示,违反了CA2200

try
{
    return await _client.GetStreamAsync(_uri);
}
catch (Exception ex)
{
    throw IsConnected ? throw ex : new IOException();
}

【问题讨论】:

  • 您是否收到有关if 版本的错误消息?我很确定三元是不合法的 C#;三元是表达式,而不是语句
  • 您是指第一个示例中的if 吗?如果是这样,不,这很好。
  • @Flydog57 throw someException 在三进制中是合法的,但 throw 不是,这是来自 C#7 stackoverflow.com/questions/42209135/…

标签: c# exception conditional-statements


【解决方案1】:

你的第一个例子很好。 throw; 将重新抛出异常,使堆栈跟踪保持完整。作为替代方案,我建议在IsConnected == false 时有条件地捕获异常:

catch when (IsConnected)
{
    throw new IOException();
}

您可以在docs 中阅读有关when 关键字的更多信息。

【讨论】:

  • catch
  • 谢谢,有道理。为了完整起见,假设您的建议暗示在我在第一个块中编写的模式中重新抛出异常在条件表达式中是不可能的,这是否正确?
  • @Hamed 不,你当然可以重新抛出它。例如:catch (Exception e) when (someCondition) { throw; } 可以正常工作,catch 中更复杂的逻辑也可以。
  • 实际上,我的意思是像condition ? throw : anotherException() 这样的模式。虽然我同意你建议的方法更清晰/可读。
  • 我相信三元表达式中单独的 throw 部分不是有效的 C#。
猜你喜欢
  • 2020-06-28
  • 2014-10-19
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
相关资源
最近更新 更多