예외는 오류를 보고하기 위한 메커니즘이며 예외가 발생한 위치로부터 상당히 떨어진 위치에서조

차 발생한 예외를 처리할 수 있는 방법을 제공한다. 오류가 발생한 원인을 나타내기 위한 정보는

반드시 예외 객체 내에 포함돼야 한다. 예외 객체에 포함된 기존 오류 관련 정보를 훼손 하지 않으면

서도 저수준의 에러 내용을 응용프로그램 관점으로 재해석한 정보를 해당 객체에 포함시키고 싶을

수 있을 것이다. 이 경우 C# 응용프로그램 내에서 사용자 지정 예외 클래스를 만들면 되는데 이때

각별히 주의해야 한다.

우선 예외 클래스를 언제 작성할지, 예외 클래스를 작성해야 하는 이유가 무엇인지, 그리고 계층적

으로 어떤 정보를 담도록 작성할지를 알아야 한다. 우선 catch 문을 작성할 때 예외의 런타임 타입에

따라 서로 다른 작업을 수행하도록 코드를 작성하는 것이 일반적이다. 즉 예외를 발생시킬 때 어떤

예외 클래스를 사용하느냐에 따라 서로 작업이 수행된다는 점을 알아야 한다.

try
{
		Foo();
		Bar();
}
catch (MyFirstApplicationException e1)
{
		FixProblem(e1);
}
catch (AnotherApplicationException e2)
{
		ReportErrorAndContinue(e2);
}
catch (YetAnotehrApplicationException e3)
{
		ReportErrorAndShutdown(e3)
}
catch (Exception e)
{
		ReportGenericErroer(e);
		throw;
}
finally
{
		CleanupResources();
}

앞의 예와 같이 예외의 런타임에 타입별로 각기 다른 catch 문을 작성할 수 있다. catch 문 내에서

서로 다른 작업을 수행해야 한다면 별개의 예외 클래스가 필요하다. 위의 예에서만 보더라도 각각의

예외 별로 각기 다른 작업을 수행하고 있음을 알 수 있다. 예외를 유발할 가능성이 있는 타입을 사용

하는 사용자의 관점에서 보자면 서로 다르게 처리돼야 하는 예외에 대해서만 독립적으로 catch 문을

작성하고 싶을 것이다. 따라서 예외 클래스를 개발하는 개발자는 다른 예외와는 달리 별도의 조치가

필요하다고 예상되는 경우에만 추가적으로 예외 클래스를 만드는 것이 좋다. 그렇지 않으면 쓸모없