在条件表达式中重新引发异常

Ham*_*med 2 c# exception conditional-statements

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

try
{
    return await _client.GetStreamAsync(_uri);
}
catch
{                
    if (IsConnected)
        throw;
    else
        throw new IOException();
}
Run Code Online (Sandbox Code Playgroud)

C# 编译器不喜欢以下内容

IsConnected ? throw : new IOException();
Run Code Online (Sandbox Code Playgroud)

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

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

Joh*_*ica 5

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

catch when (IsConnected)
{
    throw new IOException();
}
Run Code Online (Sandbox Code Playgroud)

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