예외 개요
업데이트: 2007년 11월
예외란 프로그램 실행 중 발생한 모든 오류 상태 또는 예기치 못한 동작을 말합니다. 예외는 사용자의 코드나, 공유 라이브러리와 같이 사용자가 호출한 코드에 오류가 있거나, 운영 체제 리소스를 사용할 수 없게 되거나, 공용 언어 런타임에서의 예기치 못한 상황 등에 의해 발생합니다. 사용자가 작성한 응용 프로그램은 이러한 일부 상황으로부터 복구를 할 수 있지만 복구할 수 없는 경우도 있습니다. 응용 프로그램 예외로부터는 대부분 복구할 수 있지만 런타임 예외로부터는 대부분 복구할 수 없습니다.
.NET Framework에서 예외는 Exception 클래스에서 상속 받은 개체입니다. 예외는 문제가 발생한 코드 영역에서 throw됩니다. 예외는 응용 프로그램에서 이를 처리하기 전 또는 프로그램이 종료되기 전까지는 스택으로 전달됩니다. .NET Framework를 사용하여 예외를 처리하는 것에 대한 자세한 내용은 Exception 클래스 항목을 참조하십시오.
런타임에서 예외를 관리하는 방법
런타임에서는 예외 개체 및 보호된 코드 블록을 기반으로 하는 예외 처리 모델을 사용합니다. Exception 개체는 예외가 발생할 때 예외를 나타내기 위해 만든 것입니다.
런타임에서는 각 실행 파일에 대한 예외 정보 테이블을 만듭니다. 실행 파일의 각 메서드는 예외 정보 테이블 내에 관련된 예외 처리 정보 배열을 갖고 있으며 이 배열은 빈 배열일 수도 있습니다. 이 배열의 각 엔트리는 보호된 코드 블록, 이 코드와 관련된 예외 필터, 모든 예외 처리기(catch 문)를 나타냅니다. 이 예외 테이블을 대단히 효율적이어서 예외가 발생하지 않은 경우에는 프로세서 시간이나 메모리 사용에 있어 성능에 영향을 주지 않습니다. 예외가 발생할 때에만 리소스를 사용합니다.
예외 정보 테이블에는 보호된 블록을 처리할 네 가지 예외 처리기가 있습니다.
블록 종료의 원인이 일반적인 제어 흐름에 있는지 처리되지 않는 예외에 있는지에 관계없이 블록이 끝날 때 실행되는 finally 처리기
예외 발생 시에만 실행되고 일반적인 제어 흐름이 완료될 때에는 실행되지 않는 fault 처리기
지정한 클래스의 예외나 이 클래스가 파생된 클래스의 예외를 처리하는 형식 필터 처리기
관련된 처리기로 예외를 처리할지 보호된 다음 블록으로 예외를 전달할지를 결정하기 위해 사용자 지정 코드를 실행하는 사용자 필터 처리기
각 언어는 이러한 예외 처리기를 해당 사양에 따라 구현합니다. 예를 들어, Visual Basic 2005에서는 catch 문에 When 키워드를 사용하여 변수를 비교함으로써 사용자 필터 처리기에 액세스할 수 있지만 C#에서는 사용자 필터 처리기를 구현하지 않습니다.
예외가 발생하면 런타임에서는 두 단계의 과정이 시작됩니다.
런타임에서는 배열에서 다음과 같은 보호된 첫 번째 블록을 검색합니다.
현재 실행되고 있는 명령이 포함되어 있는 영역을 보호하며
예외 처리기가 포함되어 있거나 예외를 처리하는 필터가 포함되어 있는 블록
일치하는 내용이 있으면 런타임에서는 예외를 나타내는 Exception 개체를 만듭니다. 그런 다음, 런타임에서 예외가 발생한 문과 예외를 처리하는 문 사이의 모든 finally 또는 오류 문을 실행합니다. 예외 처리기의 순서는 중요합니다. 가장 안쪽에 있는 예외 처리기가 제일 먼저 평가됩니다. 또한, 예외 처리기에서는 예외를 catch한 루틴의 지역 변수와 지역 메모리에 액세스할 수 있지만 예외가 throw되는 시점에서의 중간 값은 손실됩니다.
현재 메서드에 일치하는 내용이 없으면 런타임에서는 현재 메서드를 호출한 각 호출자를 검색하여 이러한 과정을 스택까지 진행합니다. 일치하는 내용이 있는 호출자가 없으면 런타임에서는 디버거에서 해당 예외에 액세스할 수 있도록 허용합니다. 이 디버거가 예외에 연결되지 않으면 런타임에서는 UnhandledException 이벤트를 발생시킵니다. UnhandledException 이벤트에 대한 수신기가 없으면 런타임에서는 스택 추적을 덤프한 다음 프로그램을 끝냅니다.
런타임 예외 필터링
유형이나 몇몇 사용자 정의 기준을 사용하여 catch 및 처리하는 예외를 필터링할 수 있습니다.
형식 필터 처리기는 특정 유형의 예외나 이 예외에서 파생된 클래스를 처리합니다. 가장 많이 사용하는 형태의 형식 필터 예외 처리기에서는 특정 예외 클래스만 catch되도록 지정합니다.
다음 예제에서는 특정 예외, 여기서는 FileNotFoundException이라는 예외를 catch하기 위해 디자인된 예외 처리기를 보여 줍니다.
Catch e As FileNotFoundException
Console.WriteLine("[Data File Missing] {0}", e)
catch(FileNotFoundException e) {
Console.WriteLine("[Data File Missing] {0}", e);
}
사용자 필터 예외 처리기는 사용자가 예외에 대해 정의한 요구 사항을 기반으로 예외를 catch하고 처리합니다. 이러한 처리기는 Visual Basic 2005의 Catch 문에 When 키워드를 사용합니다. 이런 방식으로 예외를 필터링하는 데 대한 자세한 내용은 Catch 블록에 특정 예외 사용을 참조하십시오.