C# 팁: WHEN 절을 사용한 예외 처리

6734 단어 csharpdotnet
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 키워드가 유용합니다.

CSharp when 절



이를 사용하여 두 개의 별개catch 블록을 생성할 수 있으며 각 블록은 가능한 가장 깔끔한 방식으로 케이스를 처리합니다.

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");
}


catch되는 예외의 현재 인스턴스를 참조할 수도 있는 조건과 함께 when 키워드를 사용해야 합니다. 실제로 조건은 Value 인스턴스의 RandomException 속성을 참조합니다.

실제 사용법: HTTP 응답 오류



좋아요, 무작위 예외가 있는 그 예는 약간... 쓸모가 없나요?

실제 예를 살펴보겠습니다. 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) 블록으로 예외 처리를 라우팅하는 데 사용할 수 있는 반환된 상태 코드에 대한 정보가 포함되어 있습니다.

꽤 흥미롭죠? 😉

더 읽어보시려면 the official documentation으로 가세요. 많지는 않지만요.

즐거운 코딩하세요!

🐧

좋은 웹페이지 즐겨찾기