時には、if節による例外処理


Cから6までは、あなたはwhen 例外を扱う前に条件を指定するキーワード.
これを考えてください-かなり役に立たない、私は認めなければなりません-例外タイプ
public class RandomException : System.Exception
{
    public int Value { get; }
    public RandomException()
    {
        Value = (new Random()).Next();
    }
}
この例外型はValue 例外がスローされたときにランダムな値が設定されているプロパティ.
かどうかを別のメッセージを印刷する場合はValue プロパティは奇妙ですか?
こうすることができます.
try
{
    throw new RandomException();
}
catch (RandomException re)  
{
    if(re.Value % 2 == 0)
        Console.WriteLine("Exception with even value");
    else 
        Console.WriteLine("Exception with odd value");
} 
しかし、まあ、あなたはcatch ブロック可能な限り簡単です.
それがどこだwhen キーワードは便利です.

時分割


つの別個を作成するために使用することができますcatch ブロック、それらの1つは、最もきれいな方法で彼らのケースを扱います.
try
{
    throw new RandomException();
}
catch (RandomException re) when (re.Value % 2 == 0)
{
    Console.WriteLine("Exception with even value");
}
catch (RandomException re)
{
    Console.WriteLine("Exception with odd value");
}
あなたはwhen キーワードとして、条件付きのキーワードを指定します.実際、状態はValue プロパティRandomException インスタンス.

実際の使用法: HTTPレスポンスエラー


OK、ランダムな例外の例は少しです.役に立たない?
実際の例を見ましょう:HTTP呼び出しに失敗した場合に異なるHTTPステータスコードを扱います.
次のスニペットでは、指定されたステータスコード(私の場合は506)を返すエンドポイントを呼び出します.
try
{
    var endpoint = "https://mock.codes/506";
    var httpClient = new HttpClient();
    var response = await httpClient.GetAsync(endpoint);
    response.EnsureSuccessStatusCode();
}
catch (HttpRequestException ex) when (ex.StatusCode == (HttpStatusCode)506)
{
    Console.WriteLine("Handle 506: Variant also negotiates");
}
catch (HttpRequestException ex)
{
    Console.WriteLine("Handle another status code");
}
レスポンスが成功していない場合response.EnsureSuccessStatusCode() 型の例外をスローするHttpRequestException . スローされた例外には、返されたステータスコードに関する情報が含まれていますcatch 使用ブロックwhen (ex.StatusCode == (HttpStatusCode)506) .
全く面白い、uh?😉
もっと読むには、あなたはthe official documentation , それほど多くないとしても.
ハッピーコーディング!
🐧