표준 catch 절은 예외의 타입에 따라 그에 부합하는 예외만을 잡으며 다른 타입의 예외에 대해서는

신경 쓰지 않는다. 응용프로그램의 상태나 객체의 상태 혹은 예외 객체가 가진 각종 속성등을 다루는

코드는 반듯이 해당 catch 문 안에 작성해야 했다. 이러한 한계 때문에 우선 예외를 잡은 후 분석 과정

을 수행한 다음, 그 내용을 기반으로 예외를 다시 발생시키는 코드를 작성하곤 했다.

하지만 이러한 코딩 방식은 분석을 상당히 어렵게 만들 뿐 아니라 추가적인 런타임 비용이 발생한다.

어떤 경우 예외를 잡고 처리할 것인지를 결정하는 방법으로 예외 필터를 사용하면 사후 분석을 더

효과적으로 수행할 수 있고 런타임 비용 또한 최소화할 수 있다. 따라서 catch 문내에서 조건문을

이용하여 분기하기보다는 예외 필터를 이용하여 개발하는 방식을 사용하는 것이 좋다.

위에서 논의한 두 가지 경우에 대해 컴파일러가 생성한 코드가 어떻게 다른지를 살펴보면 예외 필터

가 훨씬 낫다는 것을 명확하게 이해할 수 있다. 예외 필터는 catch 문 이후에 when 키워드를 이용하

여 구성하게 되는데 catch 문에 지정한 예외타입에 대해서만 필터가 수행된다.

var retryCount = 0;
var dataString = default(String);

while (dataString == null)
{
		try
		{
				dataString = MakeWebRequest();
		}
		catch (TimeoutException e) when (retryCount++ < 3)
		{
				WriteLine("Operation timed out. Trying again");
				// 재시도 이전에 잠깐 멈춘다.
				Task.Delay(10000 * retryCount);
		}
}

컴파일러는 스택 되감기(stack unwinding)를 수행하기 이전에 예외 필터를 수행하도록 코드를 생성

한다. when 절에서는 예외에 대한 위치를 알고 있기 때문에 호출 스택이나 지역변수 등에 대한 모든

정보에 접근할 수 있다. 만약 예외 필터가 false를 반환하면 런타임은 콜 스택을 따라 올라가면서

앞서 발생한 예외의 타입에 부합하는 catch 문을 계속 찾아나간다. 이 과정에서 응용프로그램의